{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "name": "MA_GAN_estimation.ipynb",
      "provenance": [],
      "collapsed_sections": [],
      "machine_shape": "hm",
      "include_colab_link": true
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    },
    "accelerator": "GPU"
  },
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "view-in-github",
        "colab_type": "text"
      },
      "source": [
        "<a href=\"https://colab.research.google.com/github/BenYavor/MA_GAN/blob/master/MA_GAN_estimation.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "2-49-RQG7bEV",
        "colab_type": "code",
        "outputId": "d2392374-bef0-49a7-8942-360b7b2925ef",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 662
        }
      },
      "source": [
        "!pip install tensorflow==2.0.0rc2\n",
        "import numpy as np\n",
        "%matplotlib inline\n",
        "import matplotlib.pyplot as plt   \n",
        "import warnings\n",
        "with warnings.catch_warnings():\n",
        "    warnings.filterwarnings(\"ignore\",category=FutureWarning)\n",
        "    import tensorflow as tf\n",
        "import os\n",
        "tf.__version__\n",
        "from tensorflow import keras\n",
        "import time\n",
        "from __future__ import absolute_import, division, print_function, unicode_literals\n",
        "import pandas as pd"
      ],
      "execution_count": 1,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Collecting tensorflow==2.0.0rc2\n",
            "\u001b[?25l  Downloading https://files.pythonhosted.org/packages/46/b2/0a8f6f62cdd91c7d727efc717f339265ace99b36847f2bda7a9f2897cfee/tensorflow-2.0.0rc2-cp36-cp36m-manylinux2010_x86_64.whl (86.3MB)\n",
            "\u001b[K     |████████████████████████████████| 86.3MB 1.4MB/s \n",
            "\u001b[?25hRequirement already satisfied: protobuf>=3.6.1 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0rc2) (3.7.1)\n",
            "Requirement already satisfied: wrapt>=1.11.1 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0rc2) (1.11.2)\n",
            "Requirement already satisfied: wheel>=0.26 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0rc2) (0.33.6)\n",
            "Requirement already satisfied: google-pasta>=0.1.6 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0rc2) (0.1.7)\n",
            "Requirement already satisfied: six>=1.10.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0rc2) (1.12.0)\n",
            "Requirement already satisfied: keras-applications>=1.0.8 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0rc2) (1.0.8)\n",
            "Requirement already satisfied: numpy<2.0,>=1.16.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0rc2) (1.16.5)\n",
            "Requirement already satisfied: absl-py>=0.7.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0rc2) (0.8.0)\n",
            "Collecting tensorboard<2.1.0,>=2.0.0 (from tensorflow==2.0.0rc2)\n",
            "\u001b[?25l  Downloading https://files.pythonhosted.org/packages/9b/a6/e8ffa4e2ddb216449d34cfcb825ebb38206bee5c4553d69e7bc8bc2c5d64/tensorboard-2.0.0-py3-none-any.whl (3.8MB)\n",
            "\u001b[K     |████████████████████████████████| 3.8MB 28.6MB/s \n",
            "\u001b[?25hCollecting tf-estimator-nightly<1.14.0.dev2019080602,>=1.14.0.dev2019080601 (from tensorflow==2.0.0rc2)\n",
            "\u001b[?25l  Downloading https://files.pythonhosted.org/packages/21/28/f2a27a62943d5f041e4a6fd404b2d21cb7c59b2242a4e73b03d9ba166552/tf_estimator_nightly-1.14.0.dev2019080601-py2.py3-none-any.whl (501kB)\n",
            "\u001b[K     |████████████████████████████████| 501kB 43.1MB/s \n",
            "\u001b[?25hRequirement already satisfied: termcolor>=1.1.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0rc2) (1.1.0)\n",
            "Requirement already satisfied: grpcio>=1.8.6 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0rc2) (1.15.0)\n",
            "Requirement already satisfied: opt-einsum>=2.3.2 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0rc2) (3.1.0)\n",
            "Requirement already satisfied: astor>=0.6.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0rc2) (0.8.0)\n",
            "Requirement already satisfied: keras-preprocessing>=1.0.5 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0rc2) (1.1.0)\n",
            "Requirement already satisfied: gast==0.2.2 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0rc2) (0.2.2)\n",
            "Requirement already satisfied: setuptools in /usr/local/lib/python3.6/dist-packages (from protobuf>=3.6.1->tensorflow==2.0.0rc2) (41.2.0)\n",
            "Requirement already satisfied: h5py in /usr/local/lib/python3.6/dist-packages (from keras-applications>=1.0.8->tensorflow==2.0.0rc2) (2.8.0)\n",
            "Requirement already satisfied: werkzeug>=0.11.15 in /usr/local/lib/python3.6/dist-packages (from tensorboard<2.1.0,>=2.0.0->tensorflow==2.0.0rc2) (0.16.0)\n",
            "Requirement already satisfied: markdown>=2.6.8 in /usr/local/lib/python3.6/dist-packages (from tensorboard<2.1.0,>=2.0.0->tensorflow==2.0.0rc2) (3.1.1)\n",
            "Installing collected packages: tensorboard, tf-estimator-nightly, tensorflow\n",
            "  Found existing installation: tensorboard 1.15.0\n",
            "    Uninstalling tensorboard-1.15.0:\n",
            "      Successfully uninstalled tensorboard-1.15.0\n",
            "  Found existing installation: tensorflow 1.15.0rc3\n",
            "    Uninstalling tensorflow-1.15.0rc3:\n",
            "      Successfully uninstalled tensorflow-1.15.0rc3\n",
            "Successfully installed tensorboard-2.0.0 tensorflow-2.0.0rc2 tf-estimator-nightly-1.14.0.dev2019080601\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "4qpY-gawAf-9",
        "colab_type": "text"
      },
      "source": [
        "###Systemparameter\n",
        "$k$ - die Anzhal der bits \\\\\n",
        "$M$ - Anzahl der unterschiedlichen Nachrichten \\\\\n",
        "$n$ - channel uses\\\\\n",
        "$N$ - Länge des Rauschvektors"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "86Y2r6qBAgKW",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "k = 9      # Number of information bits per message, i.e., M=2**k\n",
        "M = 2**k\n",
        "n = 6     # Number of real channel uses per message\n",
        "seed = 2    # Seed RNG reproduce identical results\n",
        "D_nb_weights = 32\n",
        "G_nb_weights = 32\n",
        "\n",
        "\n",
        "batch_size = 100\n",
        "\n",
        "x = tf.random.normal((batch_size,n))    #randomly sample input data (\"fake\" AE messages)\n",
        "x = x/tf.sqrt(2*tf.reduce_mean(tf.square(x))) #Average power normalization (not required if standard normal distribution is used )\n"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "cY9sHsfWT8By",
        "colab_type": "text"
      },
      "source": [
        "## Generator Model"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "uV7pjryDv4M4",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "def EbNo2Sigma(ebnodb):\n",
        "    '''Convert Eb/No in dB to noise standard deviation'''\n",
        "    ebno = 10**(ebnodb/10)\n",
        "    return 1/np.sqrt(2*(2*k/n)*ebno)\n",
        "\n",
        "#numpy version of kl divergence\n",
        "def kl_divergence_np(p, q):\n",
        "    #use \"Laplace correction\" w to avoid zero and inf\n",
        "    w=1e-5\n",
        "    p = p + w\n",
        "    q = q + w\n",
        "    return np.sum(p * np.log(p / q))\n",
        "\n",
        "#tensorflow version of kl divergence\n",
        "def kl_divergence_tf(p, q):\n",
        "    #use \"Laplace correction\" w to avoid zero and inf\n",
        "    w = 1e-5\n",
        "    p = p + w\n",
        "    q = q + w\n",
        "    return tf.reduce_sum(p * tf.log(p / q))\n",
        "  \n",
        "  \n",
        "  \n",
        "train_SNR_dB = 7\n",
        "noise_std = EbNo2Sigma(train_SNR_dB)"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "3CbjziKpv35v",
        "colab_type": "text"
      },
      "source": [
        "# Generator model"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "LXbS5lM9Tb9B",
        "colab_type": "code",
        "outputId": "e4896dcb-01c3-4b5e-8bef-97a6b5dac15b",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 660
        }
      },
      "source": [
        "input1 = tf.keras.layers.Input(shape=(n,))\n",
        "x1 = tf.keras.layers.Dense(n)(input1)\n",
        "input2 =tf.random.normal([tf.shape(input1)[0],n])\n",
        "x2 = tf.keras.layers.Dense(n)(input2)\n",
        "subtracted = tf.keras.layers.Concatenate(1)([x1, x2])\n",
        "h1 = tf.keras.layers.Dense(32,use_bias=True,  activation='relu')(subtracted)\n",
        "h2 = tf.keras.layers.Dense(32,use_bias=True, activation='relu')(h1)\n",
        "out = tf.keras.layers.Dense(n, use_bias= True, activation='linear')(h2)\n",
        "\n",
        "generator = tf.keras.models.Model(inputs=[input1], outputs=out)\n",
        "generator.summary()\n",
        "\n",
        "tf.print(generator([x]).shape)"
      ],
      "execution_count": 4,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Model: \"model\"\n",
            "__________________________________________________________________________________________________\n",
            "Layer (type)                    Output Shape         Param #     Connected to                     \n",
            "==================================================================================================\n",
            "input_1 (InputLayer)            [(None, 6)]          0                                            \n",
            "__________________________________________________________________________________________________\n",
            "tf_op_layer_Shape (TensorFlowOp [(2,)]               0           input_1[0][0]                    \n",
            "__________________________________________________________________________________________________\n",
            "tf_op_layer_strided_slice (Tens [()]                 0           tf_op_layer_Shape[0][0]          \n",
            "__________________________________________________________________________________________________\n",
            "tf_op_layer_random_normal/shape [(2,)]               0           tf_op_layer_strided_slice[0][0]  \n",
            "__________________________________________________________________________________________________\n",
            "tf_op_layer_RandomStandardNorma [(None, 6)]          0           tf_op_layer_random_normal/shape[0\n",
            "__________________________________________________________________________________________________\n",
            "tf_op_layer_mul (TensorFlowOpLa [(None, 6)]          0           tf_op_layer_RandomStandardNormal[\n",
            "__________________________________________________________________________________________________\n",
            "tf_op_layer_random_normal (Tens [(None, 6)]          0           tf_op_layer_mul[0][0]            \n",
            "__________________________________________________________________________________________________\n",
            "dense (Dense)                   (None, 6)            42          input_1[0][0]                    \n",
            "__________________________________________________________________________________________________\n",
            "dense_1 (Dense)                 (None, 6)            42          tf_op_layer_random_normal[0][0]  \n",
            "__________________________________________________________________________________________________\n",
            "concatenate (Concatenate)       (None, 12)           0           dense[0][0]                      \n",
            "                                                                 dense_1[0][0]                    \n",
            "__________________________________________________________________________________________________\n",
            "dense_2 (Dense)                 (None, 32)           416         concatenate[0][0]                \n",
            "__________________________________________________________________________________________________\n",
            "dense_3 (Dense)                 (None, 32)           1056        dense_2[0][0]                    \n",
            "__________________________________________________________________________________________________\n",
            "dense_4 (Dense)                 (None, 6)            198         dense_3[0][0]                    \n",
            "==================================================================================================\n",
            "Total params: 1,754\n",
            "Trainable params: 1,754\n",
            "Non-trainable params: 0\n",
            "__________________________________________________________________________________________________\n",
            "TensorShape([100, 6])\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "_EUzHiyUXLoP",
        "colab_type": "text"
      },
      "source": [
        "## Channels as Black-Box"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "W63_fJJRXL7A",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "\n",
        "\n",
        "def real_channel(x):\n",
        "    # Black-box Channel\n",
        "    #AWGN\n",
        "    return x + tf.random.normal(tf.shape(x), mean=0.0, stddev=noise_std)\n",
        "\n",
        "    #Rayleigh\n",
        "    #return x + tf.sqrt(tf.square(tf.random_normal(tf.shape(x), mean=0.0, stddev=noise_std)) + tf.square(tf.random_normal(tf.shape(x), mean=0.0, stddev=noise_std)))\n",
        "    \n",
        "    #Uniform U(-3;3)    \n",
        "    #return x + tf.random_uniform(tf.shape(x), minval=-2, maxval=2)\n",
        "\n",
        "    \n"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Rzh-JZgfXSqN",
        "colab_type": "text"
      },
      "source": [
        "## Discriminator\n",
        "Model definition and creating discriminator\n"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "hFMMLrY0LthL",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "randN_initial = keras.initializers.RandomNormal(mean=0.0, stddev=0.05, seed=None)\n"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "97h2eMLeXS68",
        "colab_type": "code",
        "outputId": "87433eda-259e-4a5c-9a05-a6dde25e7aa4",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 231
        }
      },
      "source": [
        "def get_discriminator():\n",
        "  model = tf.keras.Sequential()\n",
        "  model.add(tf.keras.layers.Dense(32,use_bias=True, kernel_initializer=randN_initial,activation='relu',input_shape=((2*n,))))\n",
        "  #model.add(tf.keras.layers.Dense(32,use_bias=True, kernel_initializer=randN_initial, activation='relu'))\n",
        "  model.add(tf.keras.layers.Dense(1,use_bias=False, activation='sigmoid'))\n",
        "  return model\n",
        "\n",
        "discriminator = get_discriminator()\n",
        "discriminator.summary()\n"
      ],
      "execution_count": 7,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Model: \"sequential\"\n",
            "_________________________________________________________________\n",
            "Layer (type)                 Output Shape              Param #   \n",
            "=================================================================\n",
            "dense_5 (Dense)              (None, 32)                416       \n",
            "_________________________________________________________________\n",
            "dense_6 (Dense)              (None, 1)                 32        \n",
            "=================================================================\n",
            "Total params: 448\n",
            "Trainable params: 448\n",
            "Non-trainable params: 0\n",
            "_________________________________________________________________\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "QRnlfRYuYC8R",
        "colab_type": "text"
      },
      "source": [
        "## Data Generation, überhaupt noch relevant??!!"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "EYcnkBIUXYa_",
        "colab_type": "text"
      },
      "source": [
        "## discriminator desicion????\n"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "F7im8FYMXeOV",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "cross_entropy = tf.keras.losses.BinaryCrossentropy(from_logits=True)"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "36yIH7Q3FiEq",
        "colab_type": "text"
      },
      "source": [
        "## defining Loss. TODO:\n",
        "compile the Model with the right loss functions"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "upCLjUsVDzAn",
        "colab_type": "code",
        "outputId": "e5845e47-834c-4390-e051-8e3050c78fb5",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 285
        }
      },
      "source": [
        "x = tf.random.normal((batch_size,n),dtype=tf.dtypes.float32)    #randomly sample input data (\"fake\" AE messages)\n",
        "x = x/tf.sqrt(2*tf.reduce_mean(tf.square(x)))\n",
        "real_training_data = tf.concat(values=[real_channel(x), x], axis=-1)  \n",
        "fake_training_data = tf.concat(values=[generator([x]),x], axis=-1)# training =True),x], axis=-1)\n",
        "\n",
        "tf.print(real_training_data.shape,fake_training_data.shape)\n",
        "real_output = discriminator(real_training_data)\n",
        "fake_output = discriminator(fake_training_data)\n",
        "tf.print(fake_output)\n",
        "tf.print(real_output)\n",
        "#print(real_output, fake_output)"
      ],
      "execution_count": 9,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "TensorShape([100, 12]) TensorShape([100, 12])\n",
            "[[0.493330568]\n",
            " [0.48179087]\n",
            " [0.50253123]\n",
            " ...\n",
            " [0.513492]\n",
            " [0.489805728]\n",
            " [0.513121128]]\n",
            "[[0.491955727]\n",
            " [0.449075758]\n",
            " [0.513509154]\n",
            " ...\n",
            " [0.477204382]\n",
            " [0.483900905]\n",
            " [0.472244412]]\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "ERelQ5oTEMtO",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "#def discriminator_loss(real_output, fake_output):\n",
        "  #loss= -tf.reduce_mean(tf.math.log(real_output) + tf.math.log(1. - fake_output))   #use \"-\" sign to minimize rather than maximize loss\n",
        "#  loss = tf.reduce_mean(real_output) - tf.reduce_mean(fake_output)  #Wasserstein GAN\n",
        "#  return loss\n",
        "\n",
        "def generator_loss(fake_output, generator):\n",
        "  return -tf.reduce_mean(fake_output)\n"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "0VCZBgwYBNYW",
        "colab_type": "text"
      },
      "source": [
        "# Learning Rate"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "i8J9r3UpBNl1",
        "colab_type": "code",
        "outputId": "726a123f-e1cf-483f-f9cb-b4133b85f126",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 35
        }
      },
      "source": [
        "disc_loss = tf.reduce_mean(real_output) - tf.reduce_mean(fake_output)   #use \"-\" sign to minimize rather than maximize loss\n",
        "gen_loss =  -tf.reduce_mean(fake_output)\n",
        "#disc_loss = -tf.reduce_mean(tf.math.log(real_output) + tf.math.log(1. - fake_output)) #-tf.reduce_mean(tf.math.log(real_output) + tf.math.log(1. - fake_output))   #use \"-\" sign to minimize rather than maximize loss\n",
        "#gen_loss =-tf.reduce_mean(tf.math.log(fake_output))\n",
        "\n",
        "tf.print(disc_loss, gen_loss)\n",
        "\n",
        "generator_optimizer = tf.keras.optimizers.RMSprop(learning_rate=0.0001)      #RMSprop   in oreder to test where the error comes from\n",
        "discriminator_optimizer = tf.keras.optimizers.RMSprop(learning_rate=0.0001)      #"
      ],
      "execution_count": 11,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "-0.00493592024 -0.494660199\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "gktABNcepz5c",
        "colab_type": "text"
      },
      "source": [
        "# Evaluation with Histogram"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "fgM9lv-dp1PI",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "def generate_evaluation_data(batch_size=100):\n",
        "  x = tf.random.normal((batch_size,n),dtype=tf.dtypes.float32)    #randomly sample input data (\"fake\" AE messages)\n",
        "  x = x/tf.sqrt(2*tf.reduce_mean(tf.square(x))) #Average power normalization (not required if standard normal distribution is used )\n",
        "  #G_n = tf.random.normal([tf.shape(x)[0],n],dtype=tf.float32) \n",
        "  #inputs = tf.concat(values=[x, G_n], axis=1)\n",
        "  fake_eval_data = tf.concat(values=[generator([x]), x], axis=1)\n",
        "  real_eval_data = tf.concat(values=[real_channel(x), x], axis=1) #tf.concat(values=[real_channel(x),x], axis=1)\n",
        "  inputs = x\n",
        "  return  real_eval_data, fake_eval_data, inputs \n",
        "\n",
        "\n",
        "\n",
        "def get_evaluation_data(evaluation_per_epochs):\n",
        "  real_eval_data = []\n",
        "  fake_eval_data  = []\n",
        "  inputs = []\n",
        "  for i in range(evaluation_per_epochs):\n",
        "    data = generate_evaluation_data()\n",
        "    real_eval_data.append(data[0])\n",
        "    fake_eval_data.append(data[1])\n",
        "    inputs.append(data[2])\n",
        "  return real_eval_data, fake_eval_data, inputs\n",
        "\n",
        "\n",
        "def test_eval(real_eval_data,fake_eval_data,inputs):\n",
        "  hist_range = 3\n",
        "  \n",
        "\n",
        "  \n",
        "  fake_output_hist = np.mean(fake_eval_data,axis=0)  # Changed from 0 to 1\n",
        "  real_output_hist = np.mean(real_eval_data,axis=0)\n",
        "  inputs_hist = np.mean(inputs,axis=0)\n",
        "    \n",
        "  fake_output_hist1 = np.reshape( fake_output_hist,[-1,])\n",
        "  real_output_hist1 = np.reshape( real_output_hist,[-1,])\n",
        "    \n",
        "  plt.hist(fake_output_hist1,bins=100,range=(-hist_range,hist_range),density=True,histtype='step')\n",
        "  plt.hist(real_output_hist1,bins=100,range=(-hist_range,hist_range),density=True,histtype='step')    \n",
        "  plt.title(\"noise distribution\")\n",
        "  plt.legend([\"generator\", \"target\"])\n",
        "  plt.show()\n",
        "  tf.print(inputs_hist.shape)\n",
        "  \n",
        "  "
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "RXQWOgXnl62o",
        "colab_type": "text"
      },
      "source": [
        "### Define the training loop"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "1sl75gEZl6Rv",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "epochs = 5000\n",
        "steps_per_epoches = 100\n",
        "batch_size = 100\n",
        "\n",
        "evaluation_per_epochs = 10\n",
        "\n",
        "seed = tf.random.normal([batch_size, n])\n",
        "\n"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "AZUTZng_fFBk",
        "colab_type": "text"
      },
      "source": [
        "# Wasserstein clipping"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "GEFEdt29fEj0",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "#clip_D = [p.assign(tf.clip_by_value(p, -0.001, 0.001)) for p in discriminator.trainable_variables]\n",
        "\n",
        "#def get_disc_grad(trainable_variables):\n",
        "#  return [p.assign(tf.clip_by_value(p, -0.01, 0.01)) for p in trainable_variables]\n"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "ooDukkHvmduJ",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "def train(epochs, steps_per_epoches , batch_size):\n",
        "  start = time.time()\n",
        "  counter = 0\n",
        "  epoch = 0\n",
        "  for epoch in range(epochs):\n",
        "    counter += 1\n",
        "    train_step()\n",
        "    if counter%100==0:\n",
        "      tf.print(\"counter %d:\" % (counter))\n",
        "      fake_c = generator(x)\n",
        "      tf.print(fake_c[0])\n",
        "    if counter%1000 == 0:\n",
        "      real_c = real_channel(x)\n",
        "      fake_c = generator(x)\n",
        "      real_eval_data, fake_eval_data, inputs = get_evaluation_data(evaluation_per_epochs)\n",
        "      test_eval(real_eval_data, fake_eval_data, inputs)\n",
        "      tf.print(disc_loss, gen_loss)\n",
        "    #print ('Time for epoch {} is {} sec,'.format(epoch + 1, time.time()-start))\n",
        "      tf.print ('Time for epoch {},'.format(epoch + 1))\n",
        "      \n",
        "  tf.saved_model.save(generator,'/tmp/saved_model/')\n",
        "  tf.print ('Time for the training is {} sec,'.format( time.time()-start))\n",
        "    "
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "m-xQt6M5Xd9P",
        "colab_type": "text"
      },
      "source": [
        "## Training\n",
        "strongly inspiered by: \\\\\n",
        "https://www.tensorflow.org/beta/tutorials/generative/dcgan?hl=en"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab_type": "code",
        "id": "WE_JS7kgA1W-",
        "colab": {}
      },
      "source": [
        "@tf.function\n",
        "def train_step(): #epoch, steps_per_epoches , batch_size, generator, discriminator):\n",
        "  x = tf.random.normal((batch_size,n),dtype=tf.dtypes.float32)    #randomly sample input data (\"fake\" AE messages)\n",
        "  x = x/tf.sqrt(2*tf.reduce_mean(tf.square(x)))\n",
        "  for i in range(5):\n",
        "    with tf.GradientTape() as gen_tape, tf.GradientTape() as disc_tape:\n",
        "      real_training_data = tf.concat(values=[real_channel(x), x], axis=1)\n",
        "      fake_training_data = tf.concat(values=[generator(x),x], axis=1)# training =True),x], axis=1)\n",
        "      real_output = discriminator(real_training_data)#, training=True)\n",
        "      fake_output = discriminator(fake_training_data)\n",
        "      \n",
        "      \n",
        "      disc_loss = -tf.reduce_mean(tf.math.log(real_output) + tf.math.log(1. - fake_output))\n",
        "      gen_loss =-tf.reduce_mean(tf.math.log(fake_output))\n",
        "      \n",
        "      \n",
        "      if tf.math.is_nan(disc_loss) == False:\n",
        "        gradients_of_discriminator = disc_tape.gradient(disc_loss, discriminator.trainable_variables)\n",
        "        discriminator_optimizer.apply_gradients(zip(gradients_of_discriminator, discriminator.trainable_variables))\n",
        "    \n",
        "      if i == 4:  \n",
        "        gradients_of_generator = gen_tape.gradient(gen_loss, generator.trainable_variables)\n",
        "        generator_optimizer.apply_gradients(zip(gradients_of_generator, generator.trainable_variables))\n",
        "\n"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "UuGMDjc1metC",
        "colab_type": "text"
      },
      "source": [
        "## Train the model"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "y82FQj3Jmvxx",
        "colab_type": "code",
        "outputId": "c9193b52-f7fd-4572-b5d9-95f1c15ba009",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 1000
        }
      },
      "source": [
        "%%time\n",
        "train(epochs, steps_per_epoches , batch_size)\n",
        "print(generator(x)[1])\n",
        "generator.summary()\n",
        "discriminator.summary()\n",
        "\n"
      ],
      "execution_count": 16,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "counter 100:\n",
            "[0.324959725 -0.593761265 0.0485790297 -0.432985693 -0.569447041 0.178361982]\n",
            "counter 200:\n",
            "[0.147818267 0.670665324 -0.0468239859 -0.223578185 0.239476979 0.530939758]\n",
            "counter 300:\n",
            "[0.261222392 0.232230738 -0.00835772231 -0.392909586 -0.158829272 0.235440701]\n",
            "counter 400:\n",
            "[0.185174584 0.0672336 -0.0535817891 -0.308707088 0.0918700323 0.135239393]\n",
            "counter 500:\n",
            "[0.180522606 0.621209145 -0.315140367 -0.0751734823 0.273189187 0.361925393]\n",
            "counter 600:\n",
            "[0.161722764 0.423706502 0.220422983 -0.204388499 -0.241874158 0.498063117]\n",
            "counter 700:\n",
            "[0.210456714 1.09600747 0.192017868 -0.403509617 -0.235073358 0.776958644]\n",
            "counter 800:\n",
            "[0.532202363 0.563158631 -0.259886384 -0.318925351 -0.451085448 0.874403536]\n",
            "counter 900:\n",
            "[0.0938090682 0.527940214 0.339708358 -0.094179675 -0.339974105 0.66187948]\n",
            "counter 1000:\n",
            "[0.250186771 1.06642234 0.268886298 -0.277084023 -0.413167596 0.838611066]\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\nZinz/wGBAvkfTcHi7QAAAABJRU5ErkJggg==\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "stream",
          "text": [
            "(100, 6)\n",
            "-0.00493592024 -0.494660199\n",
            "Time for epoch 1000,\n",
            "counter 1100:\n",
            "[-0.0450882539 -0.0437103212 0.147854432 -0.565831244 -0.68213743 -0.273638]\n",
            "counter 1200:\n",
            "[-0.35005188 0.479524374 0.129930466 -0.456520408 -0.263191462 -0.0103217959]\n",
            "counter 1300:\n",
            "[-0.250038892 0.711597323 0.264672488 -0.606819451 -0.362515599 0.168839455]\n",
            "counter 1400:\n",
            "[0.264454365 0.697560191 0.396392077 -0.179815561 -0.65526 -0.390777498]\n",
            "counter 1500:\n",
            "[0.205793917 0.710755229 0.480292499 -0.458563447 -0.913419604 -0.405006707]\n",
            "counter 1600:\n",
            "[-0.337097883 0.530986 0.978058636 -0.730030894 -0.241463482 -0.397554278]\n",
            "counter 1700:\n",
            "[-0.509745538 0.782412231 0.255811155 -0.683509231 -0.244663358 -0.101953581]\n",
            "counter 1800:\n",
            "[-0.439721584 0.947944045 -0.075642623 -0.735887825 -0.636539459 0.0843646526]\n",
            "counter 1900:\n",
            "[0.0164611451 0.932606161 0.627888858 -0.540169895 -0.200174689 0.118114263]\n",
            "counter 2000:\n",
            "[-0.63178885 0.985031784 0.107853383 -0.689903677 -0.489741832 0.213632122]\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\nzZ1R0LtW63hXX301hx12GJMmTeKss87i2muv5bXXXmP69Okce+yxfP7zn+fll18G4LzzzuPiiy/m\nhBNO4NOf/jR33XVXQz3XXHMN48ePZ8yYMVx55ZUAVFVVcdhhh/GNb3yDUaNGsW7dOi688EIqKio4\n6qijGvabN28eb7/9NlOmTGHKlCkALFq0iNGjRzNq1Ci+//3vN5ynf//+fO9732Ps2LE8/fTThf0w\n6r+dWvoB+gMryU0V17jst8Ck1Pr/Ide8cxnwg9T2/wlc1tK5jj322DDrig7+/m+bXLbmrV69eo/1\nQn9u+dT3zDPPxNixY2P79u2xdevW+OxnPxvXXHNNTJ06NV555ZWIiFi2bFlMmTIlIiLOPffcOOOM\nM2Lnzp3x0ksvxWc+85mIiHjwwQfj/PPPj127dsXOnTtjxowZ8fjjj8cbb7wRkuLpp59uOOemTZsi\nIqKuri4mT54czz33XC7egw+O2traiIioqamJ4cOHx4YNG+Kjjz6KKVOmxD333BMREUDccccdTV5P\n48802X9F5JnP8+rHn0zefDewMCJ+3cQuNcDw1HpZsq2GXHNPevtj+ZzTzKxQli5dysyZMykpKaGk\npIRTTjmFHTt28NRTT3HmmWc27Pfhhx82LJ922mn06tWLI488knfeeQeAhx56iIceeoijjz4agG3b\ntvHqq68yYsQIDj74YI4//viG4++8807mz59PXV0d69evZ/Xq1YwZM2aPuJYvX85JJ53EkCG5QTXP\nOeccnnjiCU477TR69+7N6aef3iGfR4uJX7m+QzcDayLi35rZbTFwkaTbyT3c3RIR6yU9CPxY0gHJ\nftOAywsQt5lZu+zatYuBAweyatWqJsv79u3bsBzJ3OQRweWXX863v/3tPfatqqpiv/32a1h/4403\nuPbaa1m+fDkHHHAA5513Xqv73peUlBS0XT8tnzb+icBfA1MlrUp+vizpAkkXJPssAV4H1gL/CXwH\nIHIPda8Glic/VyXbzMw6zcSJE7nvvvvYsWMH27Zt47e//S377rsvI0eO5Fe/+hWQS+rPPffcXus5\n+eSTWbBgAdu2bQOgpqaGDRs2fGy/rVu3st9++1FaWso777zDAw880FA2YMAA3n//fQAmTJjA448/\nzsaNG9m5cyeLFi1i8uTJhbrsZuXTq+dJYK9vDCTtS99tpmwBsKBN0ZlZjzNsYL+C9sQZNrBfi/uM\n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\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "stream",
          "text": [
            "(100, 6)\n",
            "-0.00493592024 -0.494660199\n",
            "Time for epoch 2000,\n",
            "counter 2100:\n",
            "[-0.248513311 1.10686934 0.381685376 -0.388706863 -0.515807271 -0.0536100194]\n",
            "counter 2200:\n",
            "[-0.371452361 0.994396269 0.191346824 -0.524455845 -0.208962753 0.218572542]\n",
            "counter 2300:\n",
            "[-0.112771966 0.659901381 0.319673628 -0.212029755 -0.0168675743 -0.0532372]\n",
            "counter 2400:\n",
            "[-0.137966797 0.698855162 0.325926632 -0.322608858 -0.0735932589 0.0439237282]\n",
            "counter 2500:\n",
            "[-0.143085629 0.954075 0.924851239 -0.314115971 -0.532216847 -0.166335538]\n",
            "counter 2600:\n",
            "[-0.178972051 0.530045748 0.185816407 -0.179556638 -0.320316672 -0.181330681]\n",
            "counter 2700:\n",
            "[0.0288848132 0.808289051 0.597856522 -0.170420676 0.0518523455 0.0348271392]\n",
            "counter 2800:\n",
            "[-0.115757748 0.958490729 0.751454234 -0.3201603 -0.208077684 0.164453819]\n",
            "counter 2900:\n",
            "[-0.234498292 0.865600109 0.556072295 -0.350202501 -0.319843739 -0.167913944]\n",
            "counter 3000:\n",
            "[-0.0232188366 0.699288249 0.704730868 -0.1963851 -0.0683682784 -0.0309231579]\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\ngg==\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "stream",
          "text": [
            "(100, 6)\n",
            "-0.00493592024 -0.494660199\n",
            "Time for epoch 3000,\n",
            "counter 3100:\n",
            "[-0.181413025 0.863663912 0.772354364 -0.248832107 -0.198207065 -0.045093812]\n",
            "counter 3200:\n",
            "[0.226930484 1.17988908 0.772206903 -0.374971777 -0.167442799 0.375496984]\n",
            "counter 3300:\n",
            "[-0.0553540625 1.05873525 0.71240443 -0.164811015 -0.324258983 0.227729484]\n",
            "counter 3400:\n",
            "[0.0116068944 0.929226756 0.656621575 -0.237422198 0.00530814379 0.0425989442]\n",
            "counter 3500:\n",
            "[-0.0363977291 0.944493651 0.626256943 -0.201212168 -0.188008443 0.17011185]\n",
            "counter 3600:\n",
            "[-0.032044813 1.09498966 0.721480906 -0.190173522 -0.141020805 -0.0105225742]\n",
            "counter 3700:\n",
            "[-0.0599590614 1.09017396 0.72901082 -0.158736184 -0.149642766 0.0787329823]\n",
            "counter 3800:\n",
            "[0.0540352389 1.06894481 0.692718804 -0.218370065 -0.0828419626 0.0880290046]\n",
            "counter 3900:\n",
            "[-0.0601050183 0.982219458 0.80154407 -0.240083575 -0.216483027 0.00219140947]\n",
            "counter 4000:\n",
            "[-0.035607025 0.906114459 0.8488307 -0.0428897142 -0.271930277 0.0470341966]\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\ncIYNG8bll1/eeJzevXvzk5/8hJEjR/Lcc88V9ofR8OnUmV6jR48Os85i8OV//Gxixr6531uzli1b\nttP0Tj/PAshnf88//3yMHDkytmzZEps2bYqDDjoorrnmmjjxxBPjjTfeiIiIhQsXxsSJEyMi4txz\nz40zzjgjtm/fHq+++mp8+ctfjoiIRx55JM4///zYsWNHbN++PaZMmRJPP/10vPPOOyEpnnvuucZj\nrlu3LiIi6uvrY8KECfHiiy9m6h08ONasWRMREXV1dTFw4MBYvXp1bNu2LSZOnBj3339/REQAcffd\nd+c8n6Y/02T9xZFnxrqpx8y6vQULFjB16lRKSkooKSnhlFNOYevWrTz77LOceeaZjet9+umnje9P\nO+009thjDw4//HA++OADAB599FEeffRRjjzySAA2b97Mm2++yaBBgxg8eDBHH3104/b33HMPs2bN\nor6+nvfff59ly5YxYsSInepatGgRJ5xwAuXlmUE1zznnHObPn89pp51Gjx49OP3009vl5+HgN7NU\n2rFjB3379mXp0qU5l/fq1avxfSTPJo8IrrjiCn7wgx/stG5NTQ377LNP4/Q777zDtddey6JFi9hv\nv/0477zzdrvvfUlJSUHb9bO5jd/Mur1x48bx4IMPsnXrVjZv3swf//hH9t57b4YOHcrvfvc7IBPq\nL7744i73c/LJJzN79mw2b94MQF1dHatXr/7ceps2bWKfffahtLSUDz74gIcffrhxWZ8+ffjoo48A\nGDt2LE8//TRr165l+/btzJkzhwkTJhTqtJvV4hW/pNnAN4HVETEsx/K/B87J2t9XgPKIWC+pBvgI\n2A7UR0RloQo3s65pQN+9CtoTZ0DfvVpcZ8yYMZx66qmMGDGCL37xiwwfPpzS0lLuuOMOLrzwQn7+\n85+zbds2pk2bxsiRI5vdz6RJk3jttdc45phjgMwN2N/+9refuzIfOXIkRx55JIcddhgDBw5k3Lhx\njcuqqqqYPHkyBx54IE8++STV1dVMnDiRiGDKlClMnTq1lT+J3dDSTQDgeOAo4JU81j0FeCJrugYo\ny/eGQ8PLN3etM/HN3bbJdSOyGD766KOIiPj4449j9OjRsWTJkiJX1HrtfnM3IuZLGpLn58hZwJzd\n/fAx68ye6XUxzDwbgNooo6LI9VjrVFVVsWzZMrZu3cq5557LUUcdVeySiqZgN3cl7Q1MBi7Kmh3A\n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\nkUxmo7UAAAAASUVORK5CYII=\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "stream",
          "text": [
            "(100, 6)\n",
            "-0.00493592024 -0.494660199\n",
            "Time for epoch 4000,\n",
            "counter 4100:\n",
            "[-0.163943008 0.832777798 0.802637756 -0.00297873095 -0.22823289 -0.0834520385]\n",
            "counter 4200:\n",
            "[-0.0571189523 0.968534589 0.658141 -0.224070311 -0.322441161 -0.106342956]\n",
            "counter 4300:\n",
            "[-0.0134045556 1.07737505 0.787171662 -0.35890615 -0.390286893 -0.000785447657]\n",
            "counter 4400:\n",
            "[-0.0484952182 1.04749107 0.748180747 -0.322117388 -0.288141668 0.0197065622]\n",
            "counter 4500:\n",
            "[-0.0192811303 1.01646757 0.927887678 -0.368558258 -0.294915527 0.0633778423]\n",
            "counter 4600:\n",
            "[-0.0179052055 0.893581212 0.706104219 -0.0992062837 -0.321231365 -0.0848868862]\n",
            "counter 4700:\n",
            "[-0.0952113569 0.985482454 0.954782844 -0.217583627 -0.268877029 -0.0873832181]\n",
            "counter 4800:\n",
            "[-0.0451192521 1.07871914 0.77417779 -0.106511757 -0.23790814 -0.092415072]\n",
            "counter 4900:\n",
            "[0.14096269 1.10892701 0.950103462 -0.394113928 -0.313232481 0.137161061]\n",
            "counter 5000:\n",
            "[-0.234405398 1.11942315 0.880188107 -0.0223641805 -0.148406297 -0.227519736]\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\nrkJggg==\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "stream",
          "text": [
            "(100, 6)\n",
            "-0.00493592024 -0.494660199\n",
            "Time for epoch 5000,\n",
            "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow_core/python/ops/resource_variable_ops.py:1781: calling BaseResourceVariable.__init__ (from tensorflow.python.ops.resource_variable_ops) with constraint is deprecated and will be removed in a future version.\n",
            "Instructions for updating:\n",
            "If using Keras pass *_constraint arguments to layers.\n",
            "INFO:tensorflow:Assets written to: /tmp/saved_model/assets\n",
            "Time for the training is 37.95916390419006 sec,\n",
            "tf.Tensor([-1.0483642  -1.3622326  -0.3907679   1.1852125   0.71758825  0.73069876], shape=(6,), dtype=float32)\n",
            "Model: \"model\"\n",
            "__________________________________________________________________________________________________\n",
            "Layer (type)                    Output Shape         Param #     Connected to                     \n",
            "==================================================================================================\n",
            "input_1 (InputLayer)            [(None, 6)]          0                                            \n",
            "__________________________________________________________________________________________________\n",
            "tf_op_layer_Shape (TensorFlowOp [(2,)]               0           input_1[0][0]                    \n",
            "__________________________________________________________________________________________________\n",
            "tf_op_layer_strided_slice (Tens [()]                 0           tf_op_layer_Shape[0][0]          \n",
            "__________________________________________________________________________________________________\n",
            "tf_op_layer_random_normal/shape [(2,)]               0           tf_op_layer_strided_slice[0][0]  \n",
            "__________________________________________________________________________________________________\n",
            "tf_op_layer_RandomStandardNorma [(None, 6)]          0           tf_op_layer_random_normal/shape[0\n",
            "__________________________________________________________________________________________________\n",
            "tf_op_layer_mul (TensorFlowOpLa [(None, 6)]          0           tf_op_layer_RandomStandardNormal[\n",
            "__________________________________________________________________________________________________\n",
            "tf_op_layer_random_normal (Tens [(None, 6)]          0           tf_op_layer_mul[0][0]            \n",
            "__________________________________________________________________________________________________\n",
            "dense (Dense)                   (None, 6)            42          input_1[0][0]                    \n",
            "__________________________________________________________________________________________________\n",
            "dense_1 (Dense)                 (None, 6)            42          tf_op_layer_random_normal[0][0]  \n",
            "__________________________________________________________________________________________________\n",
            "concatenate (Concatenate)       (None, 12)           0           dense[0][0]                      \n",
            "                                                                 dense_1[0][0]                    \n",
            "__________________________________________________________________________________________________\n",
            "dense_2 (Dense)                 (None, 32)           416         concatenate[0][0]                \n",
            "__________________________________________________________________________________________________\n",
            "dense_3 (Dense)                 (None, 32)           1056        dense_2[0][0]                    \n",
            "__________________________________________________________________________________________________\n",
            "dense_4 (Dense)                 (None, 6)            198         dense_3[0][0]                    \n",
            "==================================================================================================\n",
            "Total params: 1,754\n",
            "Trainable params: 1,754\n",
            "Non-trainable params: 0\n",
            "__________________________________________________________________________________________________\n",
            "Model: \"sequential\"\n",
            "_________________________________________________________________\n",
            "Layer (type)                 Output Shape              Param #   \n",
            "=================================================================\n",
            "dense_5 (Dense)              (None, 32)                416       \n",
            "_________________________________________________________________\n",
            "dense_6 (Dense)              (None, 1)                 32        \n",
            "=================================================================\n",
            "Total params: 448\n",
            "Trainable params: 448\n",
            "Non-trainable params: 0\n",
            "_________________________________________________________________\n",
            "CPU times: user 51.5 s, sys: 5.11 s, total: 56.6 s\n",
            "Wall time: 38 s\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "ra-IUz5n_niF",
        "colab_type": "text"
      },
      "source": [
        "### Setting Generator as not trainable before training AE"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "Zw6Rt5z3Rjud",
        "colab_type": "code",
        "outputId": "1e3e8ea4-3f19-4868-8e1c-f5d6dd7ac939",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 35
        }
      },
      "source": [
        "generator.trainable = False\n",
        "tf.print(generator.trainable)"
      ],
      "execution_count": 17,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "False\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "mmP50TkiAg-C",
        "colab_type": "text"
      },
      "source": [
        "## AE\n",
        "Die Idee sollte sein das Training auf den encoder und decoder einzuschränken. Jedoch soll **end-to-end** trainiert werden, hierfür sollte vllt eine art Funktion eingesetzt werden, welche über die GAN's Layer zurück geht.\n",
        "Muss ich hierfür die Layer nochmals einzeln definieren?\n",
        "\n",
        "\n",
        "***Vermutung: Der Ausgang hat die 8fache dimension des Eingangs-> daher nur 1/8 richtig oder 7/8 richtig*** \\\\\n",
        "**zu klären: was passiert in meinem AE dass sie dei dimension ver8-facht von (1000,8) zu (8000,n)**\n",
        "**Kontrollieren was der output von meinem GAN ist**\n",
        "**Add complexity for higher rubustness**\n",
        "\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "FiuN3SZYpeTU",
        "colab_type": "code",
        "outputId": "2cee46f3-24be-4fc8-df3f-25ef3a51ecc3",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 499
        }
      },
      "source": [
        "def B_Ber(input_msg, msg):\n",
        "    '''Calculate the Batch Bit Error Rate'''\n",
        "    pred_error = tf.not_equal(tf.argmax(msg, 1), tf.argmax(input_msg, 1))\n",
        "    bber = tf.reduce_mean(tf.cast(pred_error, tf.float32))\n",
        "    return bber\n",
        "\n",
        "def generate_data_vector(length):\n",
        "  random_vector = tf.random.uniform(shape =(length,),minval=0,maxval=M, dtype=tf.dtypes.int32 ,seed=None,name=None)\n",
        "  random_hot_one_vector = tf.one_hot(random_vector, depth=M,on_value=1, off_value=0,axis=-1)\n",
        "  tf.print(random_hot_one_vector.shape)\n",
        "  return random_hot_one_vector\n",
        "\n",
        "\n",
        "EncIn = tf.keras.layers.Input(shape=(M,))#, dtype= tf.int32)\n",
        "e1 = tf.keras.layers.Dense(n, activation=None)\n",
        "e2 = tf.keras.layers.Lambda(lambda x:tf.reshape(x, shape=[-1,int(n/2),2]))\n",
        "EncOut = tf.keras.layers.Lambda(lambda x: x/tf.sqrt(2*tf.reduce_mean(tf.square(x))))\n",
        "GenIn = tf.keras.layers.Lambda(lambda x:tf.reshape(x,(tf.shape(x)[0],-1)))\n",
        "GenOut = tf.keras.layers.Lambda(generator)\n",
        "DecIn = tf.keras.layers.Lambda(lambda x:tf.reshape(x, shape=[-1,int(n/2),2]))\n",
        "d1 = tf.keras.layers.Lambda(lambda x:tf.reshape(x, shape=[-1,n]))\n",
        "d2 = tf.keras.layers.Dense(M, activation='relu')\n",
        "DecOut = tf.keras.layers.Dense(M, activation='softmax')\n",
        "\n",
        "\n",
        "encoder =tf.keras.models.Sequential([EncIn,e1,e2,EncOut,GenIn]) \n",
        "decoder =tf.keras.models.Sequential([DecIn,d1,d2,DecOut])\n",
        "\n",
        "AE = tf.keras.models.Sequential([encoder,generator,decoder])\n",
        "\n",
        "def generate_data_vector(length):\n",
        "  random_vector = tf.random.uniform(shape =(length,),minval=0,maxval=M, dtype=tf.dtypes.int32 ,seed=None,name=None)\n",
        "  random_hot_one_vector = tf.one_hot(random_vector, depth=M,on_value=1, off_value=0,axis=-1)\n",
        "  tf.print(random_hot_one_vector.shape)\n",
        "  return random_hot_one_vector\n",
        "\n",
        "data, test_data = generate_data_vector(10000000), generate_data_vector(10000)\n",
        "\n",
        "AE.compile(optimizer='nadam',loss='categorical_crossentropy',metrics=[B_Ber])\n",
        "history = AE.fit(data, data, batch_size=500,steps_per_epoch=100, epochs=10)\n",
        "\n",
        "AE.summary()  "
      ],
      "execution_count": 18,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "TensorShape([10000000, 512])\n",
            "TensorShape([10000, 512])\n",
            "Train on 10000000 samples\n",
            "Epoch 1/10\n",
            "   49000/10000000 [..............................] - ETA: 13:50 - loss: 4.5006 - B_Ber: 0.6114Epoch 2/10\n",
            "   49500/10000000 [..............................] - ETA: 7:18 - loss: 1.4055 - B_Ber: 0.0770Epoch 3/10\n",
            "   49500/10000000 [..............................] - ETA: 7:18 - loss: 0.4613 - B_Ber: 0.0101Epoch 4/10\n",
            "   49500/10000000 [..............................] - ETA: 7:14 - loss: 0.2071 - B_Ber: 0.0055Epoch 5/10\n",
            "   50000/10000000 [..............................] - ETA: 7:22 - loss: 0.1198 - B_Ber: 0.0035Epoch 6/10\n",
            "   50000/10000000 [..............................] - ETA: 7:20 - loss: 0.0812 - B_Ber: 0.0030Epoch 7/10\n",
            "   50000/10000000 [..............................] - ETA: 7:22 - loss: 0.0586 - B_Ber: 0.0024Epoch 8/10\n",
            "   49000/10000000 [..............................] - ETA: 7:30 - loss: 0.0475 - B_Ber: 0.0026Epoch 9/10\n",
            "   49000/10000000 [..............................] - ETA: 7:23 - loss: 0.0384 - B_Ber: 0.0020Epoch 10/10\n",
            "   49000/10000000 [..............................] - ETA: 7:32 - loss: 0.0324 - B_Ber: 0.0021Model: \"sequential_3\"\n",
            "_________________________________________________________________\n",
            "Layer (type)                 Output Shape              Param #   \n",
            "=================================================================\n",
            "sequential_1 (Sequential)    (None, None)              3078      \n",
            "_________________________________________________________________\n",
            "model (Model)                (None, 6)                 1754      \n",
            "_________________________________________________________________\n",
            "sequential_2 (Sequential)    multiple                  266240    \n",
            "=================================================================\n",
            "Total params: 271,072\n",
            "Trainable params: 269,318\n",
            "Non-trainable params: 1,754\n",
            "_________________________________________________________________\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "r-ZsnSNgM7g2",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "\n",
        "\n",
        "def analytic_channel(input): \n",
        "  #print(input.shape)\n",
        "  return input + tf.random.normal(tf.shape(input), mean=0.0, stddev=noise_std)\n",
        "\n",
        "def real_transmision(test_data):\n",
        "  y = encoder(test_data)\n",
        "  y = real_channel(y)\n",
        "  y = decoder(y)\n",
        "  return y\n",
        "\n",
        "\n",
        "def test_diff_eval(test_data, results):\n",
        "  diff = []\n",
        "  for i in range(tf.shape(test_data)[0]):\n",
        "    diff.append(tf.math.subtract(test_data[i,:], results[i,:]))\n",
        "  return diff\n",
        "    \n",
        "  \n",
        "real_AE = real_transmision(test_data)\n",
        "testTest = tf.dtypes.cast(real_AE + tf.constant(0.2,dtype=tf.float32,shape=tf.shape(real_AE)), tf.int32)\n",
        "\n",
        "diff_test =  test_diff_eval(test_data, testTest) \n",
        "\n",
        "\n",
        "\n"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "SntX-i_2J76v",
        "colab_type": "code",
        "outputId": "8c70d7c4-a0b8-4b94-c838-316f28537116",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 35
        }
      },
      "source": [
        "tf.print(sum(diff_test))"
      ],
      "execution_count": 20,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "[1 2 2 ... 4 7 4]\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "D5B2TUanPC5d",
        "colab_type": "code",
        "outputId": "2c588efd-eafc-45a1-84de-a2cbd8a1de10",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 269
        }
      },
      "source": [
        "tes_data = np.eye(M, dtype = int)\n",
        "coding= encoder.predict(tes_data)\n",
        "fig = plt.figure(figsize=(4,4))\n",
        "plt.plot(coding[:,0], coding[:,1],\"b.\")\n",
        "plt.gca().set_ylim(-2,2)\n",
        "plt.gca().set_xlim(-2,2)\n",
        "plt.show()"
      ],
      "execution_count": 21,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 288x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "R8o3nqP_0OTK",
        "colab_type": "code",
        "outputId": "52174401-01f4-4ed3-e874-742d239a32a3",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 269
        }
      },
      "source": [
        "tes_data = np.eye(M, dtype = int)\n",
        "coding= AE.predict(tes_data)\n",
        "fig = plt.figure(figsize=(4,4))\n",
        "plt.plot(coding[:,0], coding[:,1],\"b.\")\n",
        "plt.gca().set_ylim(-2,2)\n",
        "plt.gca().set_xlim(-2,2)\n",
        "plt.show()"
      ],
      "execution_count": 22,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAARAAAAD8CAYAAAC/+/tYAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAADRhJREFUeJzt3X3MnfVdx/H3x47OhBGZggxLO2Zs\nhlWnbHdgd/CPW7sZIAu4OZJiMmUPaWIgbskSgy6Zxn+YMZnJAtlsBgEMGSzb0Bo6We1o6mJB7pLy\nUDpcJRpaqzwZ2MJcU/b1j3Ng98r95O8693ni/UpOrofzO9fvd3K3n1xP5/qmqpCkFj8x6gFImlwG\niKRmBoikZgaIpGYGiKRmBoikZp0DJMnGJPcleTzJoSQfX6RNknwuyZEkjyR5Z9d+JY3eGwawjZPA\nJ6vqoSRnAAeS7K6qxxe0uQzY3H9dDHy+P5U0wTrvgVTV8ap6qD//XeAwsOGUZlcCt1fP/cCZSc7t\n2rek0RrEHsirkpwPXAg8cMpbG4CnFiwf7a87vsg2tgPbAU4//fR3XXDBBYMcoqRVOHDgwLNVdfZK\n7QYWIEneBHwV+ERVvdi6naraAewAmJmZqfn5+QGNUNJqJfmP1bQbyFWYJKfRC487quprizQ5Bmxc\nsHxef52kCTaIqzABbgYOV9Vnl2i2E/i9/tWYdwMvVNVrDl8kTZZBHMJcAnwIeDTJwf66PwE2AVTV\nF4BdwOXAEeAl4MMD6FfSiHUOkKr6FpAV2hRwbde+JI0X70SV1MwAkdTMAJHUzACR1MwAkdTMAJHU\nzACR1MwAkdTMAJHUzACR1MwAkdTMAJHUzACR1MwAkdTMAJHUzACR1MwAkdTMAJHUbFBPZb8lydNJ\nHlvi/bkkLyQ52H99ehD9ShqtQdWFuRW4Ebh9mTb/VFXvG1B/ksbAQPZAqmof8PwgtiVpcgzzHMhs\nkoeTfD3JLw2xX0lrZKC1cZfxEPDWqvpeksuBvwU2L9ZwYW3cTZs2DWl4kloMZQ+kql6squ/153cB\npyU5a4m2O6pqpqpmzj57xdq+kkZoKAGS5C39Epgkuajf73PD6FvS2hnIIUySLwFzwFlJjgJ/CpwG\nr5a2/CDwB0lOAt8HtvWr1UmaYAMJkKq6eoX3b6R3mVfSFPFOVEnNDBBJzQwQSc0MEEnNDBBJzQwQ\nSc0MEEnNDBBJzQwQSc0MEEnNDBBJzQwQSc0MEEnNDBBJzQwQSc0MEEnNDBBJzQwQSc0MEEnNhlUb\nN0k+l+RIkkeSvHMQ/UoarUHtgdwKXLrM+5fRKyS1mV7RqM8PqF+Nof374YYbelNNt0E9lX1fkvOX\naXIlcHu/lMP9Sc5Mcm5VHR9E/xof+/fD1q1w4gSsXw979sDs7KhHpbUyrHMgG4CnFiwf7a97jSTb\nk8wnmX/mmWeGMjgNzt69vfB4+eXedO/eUY9Ia2nsTqJa2nKyzc319jzWretN5+ZGPSKtpWEV1z4G\nbFywfF5/nabM7GzvsGXv3l54ePgy3YYVIDuB65LcCVwMvOD5j+k1O2twvF4MqzbuLuBy4AjwEvDh\nQfQrabSGVRu3gGsH0Zek8TF2J1ElTQ4DRFIzA0RSMwNEUjMDRFIzA0RSMwNEUjMDRFIzA0RSMwNE\nUjMDRFIzA0RSMwNEUjMDRFIzA0RSMwNEUjMDRFIzA0RSs0GVtrw0yRP90pXXL/L+NUmeSXKw//rY\nIPqVNFqdn4maZB1wE/BeegWjHkyys6oeP6XpXVV1Xdf+JI2PQeyBXAQcqaonq+oEcCe9UpaSptwg\nAmS1ZSt/J8kjSb6SZOMi7wOWtpQmybBOov49cH5VvQPYDdy2VENLW0qTYxABsmLZyqp6rqp+0F/8\nIvCuAfQracQGESAPApuTvC3JemAbvVKWr0py7oLFK4DDA+hX0oh1vgpTVSeTXAfcC6wDbqmqQ0n+\nHJivqp3AHya5AjgJPA9c07VfSaOXXtXJ8TQzM1Pz8/OjHob0upPkQFXNrNTOO1ElNTNAJDUzQCQ1\nM0AkNTNAJDUzQCQ1M0AkNTNAJDUzQCQ1M0AkNTNAJDUzQCQ1M0AkNTNAJDUzQCQ1M0AkNTNAJDUz\nQCQ1G1Zpyzcmuav//gNJzh9Ev5JGq3OALChteRmwBbg6yZZTmn0U+J+q+gXgr4C/6Nqvxlfyo9e0\n2b8fbrihN9UAnsrOgtKWAEleKW25sDbulcCf9ee/AtyYJDXOT3RWk1NDI4Fp+Svv3w9bt8KJE7B+\nPezZA7Ozox7VaA2rtOWrbarqJPAC8DOLbczSlhpXe/f2wuPll3vTvXtHPaLRG7uTqJa21Liam+vt\neaxb15vOzY16RKM3iEOYFUtbLmhzNMkbgJ8CnhtA3xozVT9+GDMthy/QO1zZs6e35zE35+ELDCZA\nXi1tSS8otgG/e0qbncDvA/uBDwLf9PzH9Jrmv+zsrMGx0LBKW94M/E2SI/RKW27r2q+k0RvEHghV\ntQvYdcq6Ty+Y/1/gqkH0JWl8jN1JVEmTwwCR1MwAkdTMAJHUzACR1MwAkdTMAJHUzACR1MwAkdTM\nAJHUzACR1MwAkdTMAJHUzACR1MwAkdTMAJHUzACR1MwAkdSsU4Ak+ekku5N8pz998xLtXk5ysP/a\n2aVPSeOj6x7I9cCeqtoM7OkvL+b7VfVr/dcVHfuUNCa6BsiVwG39+duA3+64PUkTpGuAnFNVx/vz\n/wWcs0S7n+yXq7w/ybIhY2lLaXKsWNYhyT8Cb1nkrU8tXKiqSrJUSaG3VtWxJD8PfDPJo1X1b4s1\nrKodwA6AmZmZKS5RJE2+FQOkqt6z1HtJ/jvJuVV1PMm5wNNLbONYf/pkkr3AhcCiASJpcnQ9hHml\nZCX96d+d2iDJm5O8sT9/FnAJ8HjHfiWNga4B8hngvUm+A7ynv0ySmSRf7Lf5RWA+ycPAfcBnqsoA\nkaZAp9KWVfUcsHWR9fPAx/rz/wz8Spd+JI0n70SV1MwAkdTMAJHUzACR1MwAkdTMAJHUzACR1MwA\nkdTMAJHUzACR1MwAkdTMAJHUzACR1MwAkdTMAJHUzACR1MwAkdTMAJHUrGtpy6uSHErywyQzy7S7\nNMkTSY4kWap6naQJ03UP5DHgA8C+pRokWQfcBFwGbAGuTrKlY7+SxkDXhyofBkiyXLOLgCNV9WS/\n7Z30SmL6ZHZpwg3jHMgG4KkFy0f76xZlaUtpcnQqbVlVrykk1ZWlLaXJ0am05SodAzYuWD6vv07S\nhBvGIcyDwOYkb0uyHthGrySmpAnX9TLu+5McBWaBe5Lc21//c0l2AVTVSeA64F7gMPDlqjrUbdiS\nxkHXqzB3A3cvsv4/gcsXLO8CdnXpS9L48U5USc0MEEnNDBBJzQwQSc0MEEnNDBBJzQwQSc0MEEnN\nDBBJzQwQSc0MEEnNDBBJzQwQSc0MEEnNDBBJzQwQSc0MEEnNDBBJzYZV2vLfkzya5GCS+S59Shof\nnZ6Jyo9KW/71Ktr+RlU927E/SWNkGKUtJU2pYZ0DKeAbSQ4k2T6kPiWtsWGVtvz1qjqW5GeB3Um+\nXVX7luhvO7AdYNOmTavcvKRRGEZpS6rqWH/6dJK7gYuARQPE2rjS5FjzQ5gkpyc545V54LfonXyV\nNOHWvLQlcA7wrSQPA/8C3FNV/9ClX0njYc1LW1bVk8CvdulH0njyTlRJzQwQSc0MEEnNDBBJzQwQ\nSc0MEEnNDBBJzQwQSc0MEEnNDBBJzQwQSc0MEEnNDBBJzQwQSc0MEEnNDBBJzQwQSc0MEEnNDBBJ\nzbo+VPkvk3w7ySNJ7k5y5hLtLk3yRJIjSa7v0qek8dF1D2Q38MtV9Q7gX4E/PrVBknXATcBlwBbg\n6iRbOvYraQx0CpCq+kZVnewv3g+ct0izi4AjVfVkVZ0A7gSu7NKvpPHQqazDKT4C3LXI+g3AUwuW\njwIXL7WRhaUtgR8kmdYiVGcBz456EGvI7zfZ3r6aRgOpjZvkU8BJ4I7/zwgXs7C0ZZL5qprpus1x\nNM3fDfx+ky7J/Grada6Nm+Qa4H3A1qparJbtMWDjguXz+uskTbiuV2EuBf4IuKKqXlqi2YPA5iRv\nS7Ie2Abs7NKvpPHQ9SrMjcAZwO4kB5N8AX68Nm7/JOt1wL3AYeDLVXVoldvf0XF842yavxv4/Sbd\nqr5fFj/qkKSVeSeqpGYGiKRmYx0gq71VflIluSrJoSQ/TDI1lwSn+acLSW5J8vQ03p+UZGOS+5I8\n3v93+fGVPjPWAcIqbpWfcI8BHwD2jXogg/I6+OnCrcClox7EGjkJfLKqtgDvBq5d6W831gGyylvl\nJ1ZVHa6qJ0Y9jgGb6p8uVNU+4PlRj2MtVNXxqnqoP/9deldNNyz3mbEOkFN8BPj6qAehFS3204Vl\n/xFq/CQ5H7gQeGC5doP8LUyTYd8qP2yr+X7SOEnyJuCrwCeq6sXl2o48QAZwq/xYW+n7TSF/ujDB\nkpxGLzzuqKqvrdR+rA9hVnmrvMaLP12YUEkC3AwcrqrPruYzYx0gLHGr/LRI8v4kR4FZ4J4k9456\nTF11/OnC2EvyJWA/8PYkR5N8dNRjGqBLgA8Bv9n//3YwyeXLfcBb2SU1G/c9EEljzACR1MwAkdTM\nAJHUzACR1MwAkdTMAJHU7P8A5gzdPEnZOroAAAAASUVORK5CYII=\n",
            "text/plain": [
              "<Figure size 288x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "9ZivEgGtBv_3",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 324
        },
        "outputId": "cad8aebd-6c64-4d0c-9ca2-fef4c74e1373"
      },
      "source": [
        "pd.DataFrame(history.history).plot(figsize=(8, 5)) \n",
        "plt.grid(True)\n",
        "plt.gca().set_ylim(0, 1)\n",
        "plt.show()"
      ],
      "execution_count": 23,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAAecAAAEzCAYAAAALosttAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzt3Xd8XNWd9/HPmRn1Mm6yrWLjXqRx\nozeDTDUlBmIIZjcJsCE8eZIQUpYENoUkuxsCpGxIWAJPGiQBY8BxSCCUgAUxLQZXyQ13S+42VrG6\n5jx/3LEty7I1kka+M3e+79dLL83cOXPndyTwV/fcc8811lpEREQkfvjcLkBERESOpnAWERGJMwpn\nERGROKNwFhERiTMKZxERkTijcBYREYkzXYazMeY3xpjdxpjy47xujDEPGWPWG2NWGGNOjX2ZIiIi\nySOaI+ffATNP8PoVwNjI1+3AI70vS0REJHl1Gc7W2jeB/Sdocg3whHW8C/QzxuTHqkAREZFkE4tz\nzoXAtnbPKyPbREREpAcCJ/PDjDG34wx9k56eftrw4cNP5sf3iXA4jM8Xu3l1W2vCZKUYBmaYmO2z\nK7Hug1u80A8v9AHUj3jihT6AN/qxbt26vdbavGjaxiKcq4Bh7Z4XRbYdw1r7GPAYwPjx4+3atWtj\n8PHuKisro7S0NGb7m/PYOzS2hFnwhfNits+uxLoPbvFCP7zQB1A/4okX+gDe6IcxZku0bWPxZ8jz\nwKcjs7bPBqqttTtisN+kFCoIsnpHDa1tYbdLERERl3R55GyMeQooBQYZYyqBe4EUAGvtL4EXgSuB\n9UA9cGtfFZsMQoVBmlrDbNhzkPFDc9wuR0REXNBlOFtrb+ridQt8IWYVJbmSglwAyquqFc4iIknq\npE4Ik66NyssmPcVHxfYaZp/mdjUiIt3X0tJCZWUljY2NMdtnMBhk9erVMdtfX0pPT6eoqIiUlJQe\n70PhHGf8PkNxfi7l26vdLkVEpEcqKyvJyclhxIgRGBObK09qa2vJyYn/0URrLfv27aOyspKRI0f2\neD+JPS/do0KFQVZtryEctm6XIiLSbY2NjQwcODBmwZxIjDEMHDiw16MGCuc4VFKQS11TK1v217td\niohIjyRjMB8Si74rnONQSUEQgAoNbYuI9Eh2drbbJfSKwjkOjRuSQ4rfUF5V43YpIiLiAoVzHEoN\n+Bg/NEdHziIivWSt5a677iIUCjFp0iSefvppAHbs2MEFF1zA1KlTCYVC/OMf/6CtrY1bbrnlcNuf\n/vSnrtWt2dpxqiQ/yCurdmKtTepzNyIivTF//nyWLVvG8uXL2bt3L2eccQYXXHABTz75JJdffjnf\n/OY3aWtro76+nmXLllFVVUV5eTkABw4ccK1uhXOcChXm8vT729hR3UhBvwy3yxER6ZHv/aWCVdt7\nf4qura0Nv98PQHFBLvd+rCSq9y1atIibbroJv9/PkCFDuPDCC1m8eDFnnHEG//Zv/0ZLSwvXXnst\nU6dOZdSoUWzcuJE77riDq666issuu6zXdfeUhrXjVEmhMymsvEpD2yIisXbBBRfw5ptvUlhYyC23\n3MITTzxB//79Wb58OaWlpfzyl7/ktttuc60+HTnHqYlDc/EZKN9ew2UlQ90uR0SkR6I9wu1KTxch\nmT59Oo8++ig333wz+/fv58033+TBBx9ky5YtFBUV8dnPfpampiaWLFnClVdeSWpqKrNnz2b8+PF8\n8pOfjEntPaFwjlMZqX5G52VToSNnEZEeu+6663jnnXeYMmUKxhgeeOABhg4dyuOPP86DDz5ISkoK\n2dnZPPHEE1RVVXHrrbcSDjt3Bbzvvvtcq1vhHMdChUHe2bDP7TJERBJOXV0d4CwI8uCDD/Lggw8e\n9frNN9/MzTfffMz7lixZclLq64rOOcexkoJcdtY0sqe2ye1SRETkJFI4x7FQoVYKExFJRgrnOFYc\nubdzRQwuQxARkcShcI5juekpnDIwU0fOIiJJRuEc50IFQa2xLSKSZBTOca6kMJet++uprm9xuxQR\nETlJFM5x7vDtI3doaFtEJFkonONcSWRSWCzWphURSRZ+v5+pU6cyZcoUTj31VN5+++3jtt28eTMZ\nGRmH25977rmsXbv2JFZ7LIVznBuUnUZ+MF1rbIuIdENGRsbhu1Hdd9993HPPPSdsP3r06MPtb775\nZn7wgx9E/Vmtra29LfcYCucEUFIQpFxHziIiPVJTU0P//v171L6trY277rqLM844g8mTJ/Poo48C\nUFZWxvTp05k1axbFxcUxr1nLdyaAkoJcXluzi/rmVjJT9SsTkQTyt7th58pe7yajrRX8kX//hk6C\nK354wvYNDQ1MnTqVxsZGduzYweuvv37C9hs2bGDq1KnU1tZSX1/Pe++9B8Cvf/1rgsEgixcvpqmp\nifPOO+/wrSSXLFlCeXk5I0eO7HX/OtK/9AkgVBjEWli9o5bTTon+rz8RkWR1aFgb4J133uHTn/40\n5eXlGGM6bX9oWBvg6aef5vbbb+ell17ilVdeYcWKFTz77LMAVFdX8+GHH5KamsqZZ57ZJ8EMCueE\nECo8tFJYtcJZRBJLF0e40Wro4S0jAc455xz27t3Lnj17GDx4cJftZ82axa233gqAtZaf//znXH75\n5Ue1KSsrIysrq0f1REPnnBPA0Nx0BmalalKYiEgPrFmzhra2NgYOHBhV+0WLFjF69GgALr/8ch55\n5BFaWpy1JtatW8fBgwf7rNZDdOScAIwxFBfkaqUwEZEoHTrnDM7R7+OPP47f7z9u+0PnnK21pKam\n8qtf/QqA2267jc2bN3PqqadirSUvL48FCxb0ef0K5wQRKgzy/97cSFNrG2mB4/8HJiIizizraI0Y\nMYKGhoZOX/P5fPzgBz845tKq0tJSSktLe1PiCWlYO0GECoK0hi0f7qpzuxQREeljOnJOEIcmhZVX\nVR++z7OIiERv5cqVfOpTnzpqW1pa2uHLpuKJwjlBDOufSU5agHLdPlJEpEcmTZp0+HKpeKdh7QTh\n82lSmIgkDmut2yW4JhZ9VzgnkFBhkDU7a2htC7tdiojIcaWnp7Nv376kDGhrLfv27SM9Pb1X+9Gw\ndgIJFebS2BJm496DjBvSs4vxRUT6WlFREZWVlezZsydm+2xsbOx14J0s6enpFBUV9WofCucEcuje\nzuVV1QpnEYlbKSkpMV/WsqysjGnTpsV0n/FMw9oJZNSgLNJTfDrvLCLicQrnBBLw+5iYn0uFZmyL\niHiawjnBhAqCrNpeQzicfBMtRESShcI5wZQU5FLb1MrW/fVulyIiIn1E4ZxgDq0OpsVIRES8S+Gc\nYMYOySbFb6jYrklhIiJepXBOMGkBP+OG5OjeziIiHqZwTkChgiAV22uScvUdEZFkoHBOQCWFuew/\n2MyO6ka3SxERkT6gcE5Ah1YK03lnERFviiqcjTEzjTFrjTHrjTF3d/L6cGPMQmPMUmPMCmPMlbEv\nVQ6ZmJ+Dz6DzziIiHtVlOBtj/MDDwBVAMXCTMaa4Q7NvAfOstdOAOcD/xrpQOSIzNcDovGytFCYi\n4lHRHDmfCay31m601jYDc4FrOrSxQG7kcRDYHrsSpTMlureziIhnma5m/BpjrgdmWmtvizz/FHCW\ntfaL7drkA68A/YEs4BJr7Qed7Ot24HaAvLy80+bNmxerfrimrq6O7Ozsk/65L21qYe7aZh6akUlu\nmunVvtzqQ6x5oR9e6AOoH/HEC30Ab/RjxowZH1hrT4+mbaxuGXkT8Dtr7Y+NMecAvzfGhKy14faN\nrLWPAY8BjB8/3paWlsbo491TVlaGG/1IG7aPuWvfJTgyxIXj8nq1L7f6EGte6IcX+gDqRzzxQh/A\nO/2IVjTD2lXAsHbPiyLb2vsMMA/AWvsOkA4MikWB0rniAucsgiaFiYh4TzThvBgYa4wZaYxJxZnw\n9XyHNluBiwGMMRNxwnlPLAuVowUzUhg+IFOTwkREPKjLcLbWtgJfBF4GVuPMyq4wxnzfGDMr0uxr\nwGeNMcuBp4BbrJav6nOhwlxd6ywi4kFRnXO21r4IvNhh23faPV4FnBfb0qQrJQVBXly5k+qGFoIZ\nKW6XIyIiMaIVwhLYodtHrtLRs4iIpyicE1hJZFKYzjuLiHiLwjmBDcpOY2huus47i4h4jMI5wYUK\nc3U5lYiIxyicE1xJQZANe+qob251uxQREYkRhXOCKynIJWxh9Y5at0sREZEYUTgnuEMztjUpTETE\nOxTOCS4/mM6ArFQqdIcqERHPUDgnOGOMc/tIHTmLiHiGwtkDSgqCrNtVS1Nrm9uliIhIDCicPSBU\nmEtLm+XDXXVulyIiIjGgcPaAUIEmhYmIeInC2QOGD8gkJy1AuSaFiYh4gsLZA3w+w0RNChMR8QyF\ns0eECoKs3lFDW1i30RYRSXQKZ48IFebS2BJm4x5NChMRSXQKZ484tFKYhrZFRBKfwtkjRg3KIi3g\n06QwEREPUDh7RMDvY2K+bh8pIuIFCmcPCRXmsmp7DWFNChMRSWgKZw8JFQSpbWpl20f1bpciIiK9\noHD2kJLISmE67ywiktgUzh4ybmg2AZ/RjG0RkQSncPaQtICfcUNyqNiuI2cRkUSmcPaYUGEuFVXV\nWKtJYSIiiUrh7DElBUH2HWxmZ02j26WIiEgPKZw9JlSYC2hSmIhIIlM4e8zE/FyM0b2dRUQSmcLZ\nYzJTA4zOy9aRs4hIAlM4e1BJQa6OnEVEEpjC2YNCBUF2VDeyr67J7VJERKQHFM4eVBKZFKbrnUVE\nEpPC2YMOL+OpoW0RkYSkcPagYEYKwwZkUKFJYSIiCUnh7FGhgqCOnEVEEpTC2aNChUG27KunprHF\n7VJERKSbFM4eVVLgTApbpUlhIiIJR+HsUUfu7ayhbRGRRKNw9qi8nDSG5KbpcioRkQSkcPawUEFQ\nR84iIglI4exhJYVBNuypo6G5ze1SRESkGxTOHhYqyCVsYfVODW2LiCQShbOHlRQ6k8IqNLQtIpJQ\nFM4eVhBMp39mim4fKSKSYBTOHmaMIVQYpGKHjpxFRBJJVOFsjJlpjFlrjFlvjLn7OG0+YYxZZYyp\nMMY8GdsypadKCoKs3VlLc2vY7VJERCRKXYazMcYPPAxcARQDNxljiju0GQvcA5xnrS0BvtzlB4db\ne1SwdE9JQS4tbZZ1u2rdLkVERKIUzZHzmcB6a+1Ga20zMBe4pkObzwIPW2s/ArDW7u5qpxkNO7pb\nq/RA6NCkMN0EQ0QkYUQTzoXAtnbPKyPb2hsHjDPGvGWMedcYM7PLDw43we410VcqPXLKgEyy0wJa\nKUxEJIEYa+2JGxhzPTDTWntb5PmngLOstV9s1+avQAvwCaAIeBOYZK090GFftwO3A5yW7z/t2f++\nlc0j/zWG3Tn56urqyM7OdruME7rvvQbaLHzr7IxOX0+EPkTDC/3wQh9A/YgnXugDeKMfM2bM+MBa\ne3o0bQNRtKkChrV7XhTZ1l4l8J61tgXYZIxZB4wFFrdvZK19DHgMYNqwHDui9gNGXPgYGBNNrXGp\nrKyM0tJSt8s4oTdqK3jqn1uZfsGF+H3H/qwToQ/R8EI/vNAHUD/iiRf6AN7pR7SiGdZeDIw1xow0\nxqQCc4DnO7RZAJQCGGMG4QxzbzzRTltSsmH/BtixrNtFS/eECoI0toTZuKfO7VJERCQKXYaztbYV\n+CLwMrAamGetrTDGfN8YMyvS7GVgnzFmFbAQuMtau+9E+20NZIMvBcqf610PpEtHJoXpvLOISCKI\n6jpna+2L1tpx1trR1tr/jmz7jrX2+chja639qrW22Fo7yVo7t8t9Gh+MuRjK50NY1+D2pdF5WaQF\nfLpDlYhIgnB3hbDQbKipgm3vuVqG1wX8Pibk51Kuy6lERBKCu+E8/koIZED5s66WkQxCBblUbK+h\nq9n5IiLiPnfDOS0bxs+EigXQphXD+lKoMEhtYyvb9je4XYqIiHTB/RtfhGZD/V7Y9IbblXhaqMCZ\nFKahbRGR+Od+OI+5FNJyNWu7j40bmk3AZzQpTEQkAbgfzinpMOFqWP0XaG1yuxrPSgv4GTskh3Jd\nTiUiEvfcD2eASbOhqQY+fNXtSjwtVJBLRVW1JoWJiMS5+AjnkRdC5kANbfexUGGQfQeb2VWjEQoR\nkXgWH+HsT4Hia2Ht36BJS0z2lZKCXACddxYRiXPxEc7gzNpubYB1L7ldiWdNzM/FGM3YFhGJd/ET\nzsPPgZwCWKkFSfpKVlqAUYOytMa2iEici59w9vkg9HFY/3do+MjtajwrVBikQsPaIiJxLX7CGZyh\n7XCLc1mV9ImSgly2Vzeyr06TwkRE4lV8hXPBNOg/UrO2+9ChlcI0tC0iEr/iK5yNgUnXw6Y3oXaX\n29V4UonCWUQk7sVXOIMztG3DsOrPblfiScHMFIYNyNCMbRGROBZ/4Tx4Igwu0W0k+1BJviaFiYjE\ns/gLZ3CW89z2HhzY6nYlnhQqzGXzvnpqGlvcLkVERDoRn+Fc8nHne/l8d+vwqJJC57zzKp13FhGJ\nS/EZzgNGQuHpGtruI5qxLSIS3+IznMGZGLZzJexZ53YlnpOXk8bgnDSddxYRiVPxG84l1wFG1zz3\nkVBhUDO2RUTiVPyGc24+jDjfCWfdfzjmQgW5rN9dR0Nzm9uliIhIB/EbzuAMbe/7EHaucLsSzykp\nDBK2sGanzjuLiMSb+A7n4mvAF9DQdh84fG9nTQoTEYk78R3OmQNg9EXOJVXhsNvVeEphvwz6ZaZo\nUpiISByK73AGZ2i7ehtULna7Ek8xxhAq0KQwEZF4FP/hPP5KCKTrmuc+UFKYy7qddbSGNeFORCSe\nxH84p+fC2Mug4k/Q1up2NZ4SKgjS3Bamqk6nDERE4kn8hzM4t5E8uAc2/8PtSjzl0KSwLTUKZxGR\neJIY4Tz2MkjN0aztGBsxMIusVL/CWUQkziRGOKdkwISrYPXz0NrkdjWe4fMZSgqCCmcRkTiTGOEM\nztB2YzVseN3tSjylpDCXrbVhqht0+0gRkXiROOE8qhQyBsBKzdqOpWunFtIahm8tKMdqmVQRkbiQ\nOOHsT3FWDFv7IjQfdLsaz5gyrB/XjknhL8u389ySKrfLEREREimcwVmQpKUe1r3kdiWecvWoFM4a\nOYDv/LmcTXv1h4+IiNsSK5xPORdy8mGlZm3Hks8YfnrjVFL8Pu6cu5TmVk0QExFxU2KFs8/v3Od5\n/avQcMDtajyloF8G98+exIrKan786lq3yxERSWqJFc4AoeuhrRnW/NXtSjxnZiifm84czqNvbGTR\nh3vdLkdEJGklXjgXngr9R2hBkj7ynauLGZ2XxVfnLWNfna4pFxFxQ+KFszHOxLCNb0DdHrer8ZyM\nVD8/v+lUDtS38I3nVujyKhERFyReOIMTzrYNVi1wuxJPKi7I5e4rJvD31bv5/btb3C5HRCTpJGY4\nDymBvIka2u5Dt543gtLxefzXC6tZs7PG7XJERJJKYoYzOEfPW9+B6kq3K/EkYww/umEKuekpfOmp\npTS2tLldkohI0kjgcP648718vrt1eNig7DR+/IkprNtVx3+/sNrtckREkkZU4WyMmWmMWWuMWW+M\nufsE7WYbY6wx5vTYlXgcA0dDwTQNbfexC8flcdv5I/n9u1t4pWKn2+WIiCSFLsPZGOMHHgauAIqB\nm4wxxZ20ywHuBN6LdZHHFboediyDfRtO2kcmo7tmjqekIJevP7eCndWNbpcjIuJ50Rw5nwmst9Zu\ntNY2A3OBazpp95/A/cDJ+9c79HHA6Oi5j6UF/Dx00zSaWsJ8dd4y2sK6vEpEpC9FE86FwLZ2zysj\n2w4zxpwKDLPWvhDD2rqWW+Cst73yWdD1uH1qdF42351VzNsb9vHomxqpEBHpS4He7sAY4wN+AtwS\nRdvbgdsB8vLyKCsr6+3HU5A6iXFbfsniFx7nYPaIXu+vu+rq6mLSDzdF24fB1nLGUD8/fnkt6Qe2\nMKqfv++L64Zk+l3EO/UjfnihD+CdfkTNWnvCL+Ac4OV2z+8B7mn3PAjsBTZHvhqB7cDpJ9rvuHHj\nbEzU7bH2u/2tffXe2OyvmxYuXOjK58ZSd/pw4GCzPfe+1+wFD7xuaxtb+q6oHki230U8Uz/ihxf6\nYK03+gG8b7vI3ENf0QxrLwbGGmNGGmNSgTnA8+3CvdpaO8haO8JaOwJ4F5hlrX0/Fn88dClrEIye\n4Zx31tB2nwtmpvA/c6aybX8931lQ7nY5IiKe1GU4W2tbgS8CLwOrgXnW2gpjzPeNMbP6usCohGbD\nga1QeXL+Hkh2Z4wYwB0XjWX+0ioWLK1yuxwREc+J6pyztfZF4MUO275znLalvS+rmyZcBf40KH8W\nhp1x0j8+Gd1x0RjeWr+Xby0o59Th/Rk+MNPtkkREPCNxVwhrLz0IYy+Fij9BWMtMngwBv4//mTMV\nY+BLc5fS0hZ2uyQREc/wRjgDTLoe6nbB5kVuV5I0ivpnct/HJ7Fs2wF+9vcP3S5HRMQzvBPOYy+H\n1GwtSHKSXT25gBtOK+LhsvW8s2Gf2+WIiHiCd8I5NRPGXwmr/gytzW5Xk1S+O6uEEQOz+MrTyzhQ\nr5+9iEhveSecwZm13XgANi50u5KkkpUW4KE509h3sIlvPLfi0PXvIiLSQ94K59EXQXo/ZzlPOakm\nFQW56/LxvFyxi6f+ua3rN4iIyHF5K5wDqVA8C9a+CM31bleTdG47fxTTxw7i+3+t4MNdtW6XIyKS\nsLwVzuDcRrK5Dj582e1Kko7PZ/jxDVPITA1wx1NLaWzRZW0iIj3hvXAecT5kD9GsbZcMzk3nRzdM\nZs3OWu5/aY3b5YiIJCTvhbPPDyXXwbpXoLHa7WqS0kUThnDLuSP47VubWbhmt9vliIgkHO+FMzhD\n221NsObFrttKn7j7iglMGJrDvz+znN01jW6XIyKSULwZzkWnQ7/hzlrb4or0FD8/v2kadU2tfO2Z\n5YTDurxKRCRa3gxnY5xrnjcshIN73a4maY0dksO3ry7mHx/u5deLNrldjohIwvBmOIMTzrbNWTFM\nXPOvZw3nsuIhPPDyGsqrNAdARCQa3g3nISEYNF6ztl1mjOH+2ZMZmJXGl55aysGmVrdLEhGJe94N\n50ND21vehuoqt6tJav2zUvnJjVPYtO8g3/tLhdvliIjEPe+GMzjhjHXu8yyuOnf0ID5fOpp571fy\n1xXb3S5HRCSueTucB42B/Cka2o4TX75kHFOH9eOe+Sup/EjLq4qIHI+3wxmca563L4F9G9yuJOml\n+H08NGca1sKX5y6jtS3sdkkiInHJ++Fccp3zvWK+u3UIAMMHZvKf15bw/paP+MXC9W6XIyISl7wf\nzv2GwfBzYKWGtuPFddOKuG5aIQ+99iGLN+93uxwRkbjj/XAGZ2LYntWwa5XblUjE968poah/Jl+e\nu4zqhha3yxERiSvJEc7F14LxaznPOJKTnsLP5kxlV00j//GnlVir5T1FRA5JjnDOzoNRFzqzthUC\ncWPa8P585dJxvLBiB8+8X+l2OSIicSM5whmcoe2PNkPVErcrkXY+d+Fozhk1kHufr2DDnjq3yxER\niQvJE84TrgZ/qq55jjN+n+GnN04lLcXHnXOX0tTa5nZJIiKuS55wzugHYy51LqkKKwDiydBgOvfP\nnkx5VQ0/fmWd2+WIiLguecIZYNJsqN3hrLctceXykqH861nDeezNjby5bo/b5YiIuCq5wnncTEjJ\n1NB2nPrWVcWMHZzNV+ctZ29dk9vliIi4JrnCOTULxl/p3OO5TdfWxpuMVD8P3TSNmsYW7npmuS6v\nEpGklVzhDM6s7Yb9sLHM7UqkExPzc/mPKyawcO0efvf2ZrfLERFxRfKF85iLIT0IK7UgSby6+dwR\nXDRhMPe9uIbVO2rcLkdE5KRLvnAOpMHEj8GaF6Clwe1qpBPGGB68fjLBzBTueGopDc2aXS8iySX5\nwhmc20g218KHr7hdiRzHwOw0fvKJKazfXcd/vqA10UUkuSRnOI+YDll5mrUd56aPzeP/XDCKJ9/b\nykvlO90uR0TkpEnOcPYHnPs8r3sZGnVOM5597bLxTCoMcvf8Feyo1mkIEUkOyRnO4Mzabm2EtX9z\nuxI5gdSAj5/NmUpza5gvz11GW1iXV4mI9yVvOBedCcFhuo1kAhiVl813Z5Xw3qb9/PKNDW6XIyLS\n55I3nH0+CH0cNrwO9fvdrka6cMNpRVw9OZ+fvLqOJVs/crscEZE+lbzhDM7QdrjVWTFM4poxhv++\nbhJDc9O5c+5Sahu1wpuIeFdyh/PQyTBwrGZtJ4hgRgo/mzOVqo8a+PaCcrfLERHpM8kdzsY4R8+b\nF0HNDrerkSicPmIAd148jgXLtjN/SaXb5YiI9InkDmdwwhkLFX9yuxKJ0hcvGsOZIwbw7QXlbNl3\n0O1yRERiTuGcNw6GTtLQdgLx+ww/nTMVv8/wpbnLaGkLu12SiEhMKZzBWc6z6n3Yv8ntSiRKhf0y\n+OHsySzfdoCfvrrO7XJERGJK4QzOJVUAFfPdrUO65cpJ+dx4+jAeeWMDb6/f63Y5IiIxE1U4G2Nm\nGmPWGmPWG2Pu7uT1rxpjVhljVhhjXjPGnBL7UvtQv+Ew7CxYqaHtRHPvrGJGDsriK/OWUdus1cNE\nxBu6DGdjjB94GLgCKAZuMsYUd2i2FDjdWjsZeBZ4INaF9rnQbNhdAbtXu12JdENmaoCH5kxj/8Fm\nvvdOA394dwuNLbrFpIgktmiOnM8E1ltrN1prm4G5wDXtG1hrF1pr6yNP3wWKYlvmSVB8LRifJoYl\noFBhkN/deia5qYZvLShn+gMLefSNDdQ1tbpdmohIjxhrTzwUaIy5Hphprb0t8vxTwFnW2i8ep/0v\ngJ3W2v/q5LXbgdsB8vLyTps3b14vy4+tKcu+TVrTHv555iPONdBRqKurIzs7u48r61te6ANAbW0d\n25oz+OvGZlbtC5OVApcMT+HSU1LITo3u9+k2r/wu1I/44YU+gDf6MWPGjA+stadH0zYQyw82xnwS\nOB24sLPXrbWPAY8BjB8/3paWlsby43sv97Pw/B2UjgtC4alRvaWsrIy460c3eaEP4PTj86WlfB5Y\ntu0A/7twPX9etYtXt4X5lzMJ5nipAAAV9UlEQVSHc9v0UQwNprtd5gl56XehfsQHL/QBvNOPaEUz\nrF0FDGv3vCiy7SjGmEuAbwKzrLVNsSnvJJv4MfClaGjbA6YO68djnz6dV75yATNLhvLbtzdzwQML\nuWf+Cjbv1cIlIhLfognnxcBYY8xIY0wqMAd4vn0DY8w04FGcYN4d+zJPkoz+MOYSZ7WwsBa28IJx\nQ3L4yY1TKfv3Uj5xRhHPLanioh+X8aWnlrJ6R43b5YmIdKrLcLbWtgJfBF4GVgPzrLUVxpjvG2Nm\nRZo9CGQDzxhjlhljnj/O7uLfpOuhpgq2vet2JRJDwwZk8l/XTmLR12fw2emjeG31Lq742T/4zO8W\n88EW3YJSROJLVOecrbUvAi922Paddo8viXFd7hk3EwIZsPJZOOVct6uRGBucm849V07k86VjePyd\nzfzmrU3MfuRtzh41gM+XjmH62EGYKCcDioj0Fa0Q1lFaNoy/AlYtgDZdiuNVwcwUvnTxWN76xkV8\n66qJbN5bz6d/809m/eItXirfQTisBU1ExD0K586EZkP9PthU5nYl0sey0gLcNn0Ub3y9lB9+fBI1\njS187g9LuPSnb/DsB5W6qYaIuELh3Jmxl0JaEMq11naySAv4mXPmcF776oU8dNM0Uvw+/v2Z5ZQ+\nWMYT72zWqmMiclIpnDsTSIOJV8Pqv0BLo9vVyEkU8PuYNaWAv905nd/ccjpDctP4zp8rOP/+1/nf\nsvXUNLa4XaKIJAGF8/GEZkNTDax/1e1KxAXGGC6aMITn/u+5zL39bIoLgjzw0lrO++Hr/Ojlteyr\nS8xL+UUkMcR0hTBPGXkhZA5yFiSZ+DG3qxGXGGM4e9RAzh41kJWV1fxv2XoeLlvPrxZtZM4Zw7n9\nglEU9Mtwu0wR8RiF8/H4A1ByLSz9IzTVObO4JalNKgryyCdPY/3uOn75xgb+8O4W/vjeFq6bVsjn\nLhzNqDz9NyIisaFh7RMJzYbWBlj7N7crkTgyZnA2P7phCmV3lfIvZw7nz8u2c/FP3uALf1xCeVW1\n2+WJiAconE9k2NmQWwjlz7pdicShov6ZfO+aEIu+cRGfu3A0b67bw9U/X8Qtv/0n/9y03+3yRCSB\nKZxPxOeDkutg/WtQr39spXN5OWl8Y+YEFt19EXddPp4VldV84tF3uOGXb7Nw7W66ui2riEhHCueu\nTLoewi3OZVUiJxDMSOELM8bw1jcu4t6PFVP1UQO3/nYxVz20iBdW7KBNq46JSJQUzl3JnwoDRuk2\nkhK1jFQ/t543krK7ZvDA9ZNpbGnjC08u4dKfvMG8xdtobtWqYyJyYgrnrhgDoeth8z+gdpfb1UgC\nSQ34+MTpw3j1qxfy8L+cSkaqn68/t4ILH1zIbxZtor5Za7eLSOcUztEIzQYbdm6GIdJNfp/hqsn5\n/PWO8/ndrWcwrH8m3//rKs6/fyG/eP1Dqhu06piIHE3hHI3BE2BIyLmNpEgPGWMoHT+YeZ87h2c+\ndw5TioL86JV1nPfD1/nh39awp1arjomIQ4uQRCs0G177Hny0Bfqf4nY1kuDOGDGA3956JuVV1Tzy\nxgYefXMDv31rE+fm+2jO28nUYf0YnJvudpki4hKFc7RCH3fCuWI+nP8Vt6sRjwgVBnn4X05l4546\nHn1jI899sI2Fv/8AgPxgOlOK+jF1eD+mFPVjUlGQ7DT9LyuSDPR/erT6j4CiM5xZ2wpnibFRednc\nf/1kLu6/j4FjprBsWzXLtx1geeUBXqrYCThzE8cOzj4qsMcPzSHFr7NTIl6jcO6O0Gx46W7Ysw7y\nxrldjXhQqt9w2ikDOO2UAYe37T/YzPLKA05YbzvAa2t288wHlQCkBXyECoNMHdaPKcP6MbWoH8MG\nZGCMcasLIhIDCufuKLkOXrrHWc5zxn+4XY0kiQFZqcwYP5gZ4wcDYK2l8qMGlm47Eth/eHcLv160\nCYD+mSlOUEcCe0pRPwZkpbrZBRHpJoVzd+QMhRHnO0Pbpfc444wiJ5kxhmEDMhk2IJNZUwoAaGkL\ns3Znbbsj7GreWPchh1YOHT4g83BgTx0WpKQgSHqK38VeiMiJKJy7a9L18Jc7YcdyKJjqdjUiAKT4\nneHtUGGQfz3LuZqgrqmVlZXVhwP7g837+cvy7QAEfIbxQ3PaBXY/Rudl4/fpD06ReKBw7q6Js+CF\nrzlHzwpniWPZaQHOGT2Qc0YPPLxtd00jyyITzZZvq+Yvy7fz5HtbAchK9TOpKMiUYf2YFhkSH5qb\nrvPXIi5QOHdX5gAYfTGUz4dLvud2NSLdMjg3nctKhnJZyVAAwmHLpn0HWbb1wOEj7N8s2kRLmzMe\nPjgn7cj566J+TB4WJDc9xc0uiCQFhXNPhGbDhy9D5T/drkSkV3w+w+i8bEbnZTP7tCIAmlrbWL2j\nluXbDjhH2dsO8OqqI+vKj87LOmo4fMLQXFIDupxLJJYUzj0x4UoIpDvLeWZd7XY1IjGVFvAfDt6b\nI9uq61tYUXXgcGC/uW4P85dUAZDq91FckBuZHR5k6rD+uoe1SC8pnHsiLQfGXQ6rFmBOu8LtakT6\nXDAzhelj85g+Ng9wLufaXt14OKyXbTvA04u38bu3NwOQ6oPhS9+gsF8GRf0zKOqfSWH/Q48zyMtO\n07lskRNQOPdU6HpY9WdO2fI01E2G7Dy3KxI5aYwxFPbLoLBfBldOygegtS3M+j11LNt6gIVLVmOy\nsqk60MCKygN8VH/0nbdSAz6K+mW0C+xMivpnRMI8k8E5afg0c1ySmMK5p8ZeBqecz4gtT8OPn4Ux\nl8CUG2H8lZCS4XZ1IiddwO9jwtBcJgzNZWj9RkpLTzv82sGmVqoONFD5UT2VHzVQ9VEDlR85z1/d\nUcPeuuaj9pXq95HfL90J7n6ZR4V4Yf8Mhuam67Iv8TSFc0+lpMOtL7D4r49zRtoGWPGMM0ksLReK\nZ8HkG+GU88GniTIiWWkBxg3JYdyQnE5fb2huo+pAfSSwna9DYf762t3H3E4z4DPk90s/fKTd/qi7\nqH8GQ4PpWnNcEprCuZcOZp8CpTfDxffC5kWw4mmoWABL/wC5RTD5Bpg8x7kntIh0KiPVz5jBOYwZ\n3Hl4N7a0sf3A0aF96Ah80Yd72VXbSPs5aD4D+cHIsHkn573zgxmaYS5xTeEcKz4/jLrQ+bryR7D2\nRVg+F956CBb9FPKnOCE96XrIHux2tSIJJT3Fz6i8bEblZXf6enNrmB3VR4bKq9odgb+3aT8LljUQ\nbhfexsCQnPTDE9QKO5z3LuiXoeVNxVUK576QmumE8KTroW63c8nVirnw8j3wyrdg9EUwZY5zfjo1\n0+1qRRJeasDHKQOzOGVgVqevt7SF2VndeCS8DxwJ8g+2fsRfVuygLXz05V95OWmk2Wby17xNbnoK\nuRkp5KQHIo8DnWxLITc9QE56io7KpdcUzn0tezCc83nna/caZ9h7xTx47jOQmu0sBzrlRhgx3Tn6\nFpGYS/H7Dt8sBAYe83prW5hdtU2RI+4jQ+brt20n4POxq7aRD3fXUdPYQk1DC+EuLuNOT/EdE9iH\nHh8v0IPtAj8t4NOlZklO4XwyDZ4Al9wLF30btrzlHE1X/BmWPwk5BUfOTw8pdrtSkaQS8PsOXxp2\n5sgj99IuK9tPaenZR7W11lLf3BYJ6tbDgV3beORxTWMrte1eP1DfzNb99dQ2tlDd0HJ4edTjSfX7\nnAA/QaAfuy3l8HuyUv0K9wSncHaDzwcjpztfh89PPw1v/wLe+hkMnXTk/HTOULerFZF2jDFkpQXI\nSguQH+z++621NLWGD4d4+0A/fsi3sKO6MbKthcaW8Ak/w2c4HNi0NDJ0zTtkpfnJSguQnRYgMzVA\nduT5oW1ZaQGyUjtu85OZGtBlay5QOLstJcNZqzs0G+r2OHe7WjEXXvkmvPptGDXDOT894SpI7fx8\nmogkDmMM6Sl+0lP8DM7t2T6aW8NOaHca6JHnkXDfVLkTnw/21jWzZV89dU2t1De3cbC5lWhXWc1I\nORTskfBODRwV9p0Hu8K+NxTO8SQ7D87+nPO1Z92R89PzPwspWTDxY8756ZEX6vy0SBJLDfgYmJ3G\nwOy0LtuWlZVRWnrOMdvDYUtDSxsHm1qpa2rlYJMT2Ec9b2ptty3yPPJ6+7B32rVFXX9Pwn7Drlbs\n2t2kB/ykpfhIC/hIC/id7ynO4/QUH6l+b5yvVzjHq7xxcPG3YcY3Yes7R85Pr5gLOfnOkPfkOTA0\n5HalIpKAfL4jw/OxuLizs7A/EtxHwv542/bUNbF5X/3hPwA6Dfuli6OqxQluH2kp/sOP0w8/Pjrc\n01OODfmj3nPUtiPvPWp/7d4bq1EBhXO88/lgxHnO1xUPwrq/Oeen330E3v45DAk5q5FNugFy892u\nVkSSVF+EfX27sF/0zntMmnoqTS1hmlrbaGoN09jifG9qDdPU/nFr25F2Le22tYZpagmz/2DzUftp\n//7WrqbidyHgM+2C++g/ELq1n15VISdXSjqUXOd8HdwL5fOdoe9Xvw2vfsdZAGXyHGf4O63zxRpE\nRBKBz2fIjgxpDwG25fo5dXj/Pv/c1rZwJyHf4Q+CYwL/0GvtA//odl1N4utI4ZyosgbBWbc7X3vX\nR85PPw0LPgcvfBUmXO2cnx41Q+enRUSiFPD7CPh9ZHV9Or/bnvhMN+qI/cfLSTdoDFz0TZjxH7D1\n3cj56T/BynmQPcQZ8p58o3OJlgcmSoiIeJ3C2UuMgVPOcb5m3u/cJWv50/Deo/DOL2Bw8ZHz08FC\nt6sVEZHjUDh7VUo6FF/jfNXvh4r5TlD//V74+3dh5AVOUBfPcrtSERHpIKpwNsbMBH4G+IFfWWt/\n2OH1NOAJ4DRgH3CjtXZzbEuVHsscAGfc5nzt2+BcO71iLvz58/DC15iUWwx7nwB/GvhTwJ8KgXaP\nD30dta1929Sj252orT9V97gWEelCl+FsjPEDDwOXApXAYmPM89baVe2afQb4yFo7xhgzB7gfuLEv\nCpZeGjgaZtwDpXfDtn/CirmkrX4Nth+AthZoa4a2pnaPm2Nfgy/Q9R8Cxw39TrZFthdt2wzvrnEm\nwBkDxh953O67McduO1F7nw+Mr5PXItu7uy8RkShEc+R8JrDeWrsRwBgzF7gGaB/O1wDfjTx+FviF\nMcZYG+3icHLSGQPDz4LhZ/F+dhmlpaWdt7M2EtTtAru16dggb22KPI9F28j3lgZo6OSPho77jBgD\nsOFk/PB6oYugP6elFT5IP9S43QS+jo/pug1Ennf3cTc+4ziPp9VUw4Z+7bZ3/M6x2zvbdsLvHevt\nzns7fl7n+xi3fTvULoh8Rrt/zo75py3a1zj+a8e8NzavTdy1C/b9gU5/fkdt6/AcovzZHed3c9w2\nHT83mn3D8C2b4M12i5B09bM85ucSB226IZpwLgS2tXteCZx1vDbW2lZjTDXOfdn29qo6cZ8xztFq\nINXtSjpnLYRbobWJRW+Wcf5554INQ7gNbFuH77aTbW0QDjvvOea18HH2dYL2h9/XsX1bJ/s6tv2+\n7ZUU5OdH/keP/M9taffYRvk48p5uPW73M+325x392W3+JgikH73/Q+3C4XbbO6vlRN87tGu/36i/\nE/XnDWpugZp2/+0fdbVDhysfYvJah9c7vkTH4Ov6tZyGBmjZxrE/N+i079DFz6Xj+zjBa9H+jg8X\ndFyjADadsEkfOuYXceKf/3HbRO+kTggzxtwO3B552mSMKT+Zn99HBpH4f4R4oQ/gjX54oQ+gfsQT\nL/QBvNGP8dE2jCacq4Bh7Z4XRbZ11qbSGBMAgjgTw45irX0MeAzAGPO+tfb0aAuNV17ohxf6AN7o\nhxf6AOpHPPFCH8Ab/TDGvB9t22hmqCwGxhpjRhpjUoE5wPMd2jwP3Bx5fD3wus43i4iI9EyXR86R\nc8hfBF7GuZTqN9baCmPM94H3rbXPA78Gfm+MWQ/sxwlwERER6YGozjlba18EXuyw7TvtHjcCN3Tz\nsx/rZvt45YV+eKEP4I1+eKEPoH7EEy/0AbzRj6j7YDT6LCIiEl+0KoKIiEiccSWcjTEzjTFrjTHr\njTF3u1FDbxljfmOM2Z3Il4MZY4YZYxYaY1YZYyqMMXe6XVN3GWPSjTH/NMYsj/The27X1BvGGL8x\nZqkx5q9u19JTxpjNxpiVxphl3ZmdGk+MMf2MMc8aY9YYY1YbY85xu6buMsaMj/wODn3VGGO+7HZd\n3WWM+Urk/+1yY8xTxpj0rt8Vf4wxd0b6UBHN7+GkD2tHlgNdR7vlQIGbOiwHGveMMRcAdcAT1tqQ\n2/X0hDEmH8i31i4xxuQAHwDXJtLvwhhjgCxrbZ0xJgVYBNxprX3X5dJ6xBjzVeB0INdae7Xb9fSE\nMWYzcLq1NmGvSTXGPA78w1r7q8hVKpnW2gNu19VTkX93q4CzrLVb3K4nWsaYQpz/p4uttQ3GmHnA\ni9ba37lbWfcYY0LAXJwVN5uBl4DPWWvXH+89bhw5H14O1FrbjFPwNS7U0SvW2jdxZqYnLGvtDmvt\nksjjWmA1zmpvCcM66iJPUyJfCTmRwhhTBFwF/MrtWpKZMSYIXIBzFQrW2uZEDuaIi4ENiRTM7QSA\njMgaGpnAdpfr6YmJwHvW2nprbSvwBvDxE73BjXDubDnQhAoELzLGjACmAe+5W0n3RYaClwG7gVet\ntQnXh4j/Ab4OhN0upJcs8Iox5oPIqoCJZiSwB/ht5BTDr4wxWW4X1UtzgKfcLqK7rLVVwI+ArcAO\noNpa+4q7VfVIOTDdGDPQGJMJXMnRi3sdQxPCBGNMNvAc8GVrbY3b9XSXtbbNWjsVZ/W6MyNDSAnF\nGHM1sNta+4HbtcTA+dbaU4ErgC9ETgElkgBwKvCItXYacBBIyLkxAJFh+VnAM27X0l3GmP44I6sj\ngQIgyxjzSXer6j5r7WqcuzW+gjOkvQxoO9F73AjnaJYDlZMkcp72OeCP1tr5btfTG5Ghx4XATLdr\n6YHzgFmR87VzgYuMMX9wt6SeiRztYK3dDfwJ51RWIqkEKtuNwDyLE9aJ6gpgibV2l9uF9MAlwCZr\n7R5rbQswHzjX5Zp6xFr7a2vtadbaC4CPcOZeHZcb4RzNcqByEkQmU/0aWG2t/Ynb9fSEMSbPGNMv\n8jgDZ6LhGner6j5r7T3W2iJr7Qic/ydet9Ym3BGCMSYrMrmQyFDwZThDegnDWrsT2GaMOXSTgos5\n+ha5ieYmEnBIO2IrcLYxJjPy79XFOHNjEo4xZnDk+3Cc881Pnqj9Sb0rFRx/OdCTXUdvGWOeAkqB\nQcaYSuBea+2v3a2q284DPgWsjJyzBfiPyIpwiSIfeDwyG9UHzLPWJuxlSB4wBPiT8+8oAeBJa+1L\n7pbUI3cAf4wcQGwEbnW5nh6J/IF0KfB/3K6lJ6y17xljngWWAK3AUhJ3pbDnjDEDgRbgC11NMtQK\nYSIiInFGE8JERETijMJZREQkziicRURE4ozCWUREJM4onEVEROKMwllERCTOKJxFRETijMJZREQk\nzvx/djF86w9Hpi0AAAAASUVORK5CYII=\n",
            "text/plain": [
              "<Figure size 576x360 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "gWYttScQv3ir",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        ""
      ],
      "execution_count": 0,
      "outputs": []
    }
  ]
}